acrisci / simple-breakpad-server

Simple breakpad crash reports collecting server
https://www.npmjs.com/package/simple-breakpad-server
MIT License
67 stars 29 forks source link

Unhandled rejection Error: Order must be type of array or instance of a valid sequelize method. #30

Open ewongbb opened 3 years ago

ewongbb commented 3 years ago

I created a database on a MySQL instance 5.7.27 and granted the necessary credentials.

1) create database breakpad; [I even tried: "create database breakpad character set utf8mb4 collate utf8mb4_general_ci;" but this would give me a data too long. (or SequelizeDatabaseError: Unknown error 1071). So from a link I found, I used the following: create database breakpad character set ucs2 collate ucs2_general_ci;

2) grabbed the source from this repo 2.1) npm install .

When I went to http://127.0.0.1:1127/crashreports, I get the following dump:

Unhandled rejection Error: Order must be type of array or instance of a valid sequelize method. at MySQLQueryGenerator.getQueryOrders (/home/bpad/projs/sbpad/node_modules/sequelize/lib/dialects/abstract/query-generator.js:2004:13) at MySQLQueryGenerator.selectQuery (/home/bpad/projs/sbpad/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1356:27) at QueryInterface.select (/home/bpad/projs/sbpad/node_modules/sequelize/lib/query-interface.js:1127:27) at /home/bpad/projs/sbpad/node_modules/sequelize/lib/model.js:1759:34 at tryCatcher (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/util.js:16:23) at Promise._settlePromiseFromHandler (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/promise.js:547:31) at Promise._settlePromise (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/promise.js:604:18) at Promise._settlePromise0 (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/promise.js:649:10) at Promise._settlePromises (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/promise.js:729:18) at _drainQueueStep (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/async.js:93:12) at _drainQueue (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/async.js:86:9) at Async._drainQueues (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/async.js:102:5) at Immediate.Async.drainQueues [as _onImmediate] (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/async.js:15:14) at processImmediate (internal/timers.js:439:21)

So I set in the configuration, database logging to true, I get:

simple-breakpad-server@1.0.0 serve /home/bpad/projs/sbpad grunt serve

Running "express:dev" (express) task Starting background Express server (node:15446) [SEQUELIZE0002] DeprecationWarning: The logging-option should be either a function or false. Default: console.log Executing (default): CREATE TABLE IF NOT EXISTS crashreports (id INTEGER auto_increment , product VARCHAR(255), version VARCHAR(255), ip VARCHAR(255), customparam VARCHAR(255), upload_file_minidump LONGBLOB, customfile1 LONGBLOB, customfile2 LONGBLOB, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB;

Running "watch" task Waiting... Executing (default): SHOW INDEX FROM crashreports FROM breakpad Executing (default): ALTER TABLE crashreports ADD INDEX crashreports_created_at (created_at) Executing (default): CREATE TABLE IF NOT EXISTS symfiles (id INTEGER auto_increment , os VARCHAR(255), name VARCHAR(255), code VARCHAR(255), arch VARCHAR(255), contents LONGTEXT, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, UNIQUE compositeIndex (os, name, code, arch), PRIMARY KEY (id)) ENGINE=InnoDB; Executing (default): SHOW INDEX FROM symfiles FROM breakpad Executing (default): ALTER TABLE symfiles ADD INDEX symfiles_created_at (created_at) Executing (default): SELECT id, os, name, code, arch, contents, created_at AS createdAt, updated_at AS updatedAt FROM symfiles AS symfiles; Symfile loading finished Listening on port 1127 Unhandled rejection Error: Order must be type of array or instance of a valid sequelize method. at MySQLQueryGenerator.getQueryOrders (/home/bpad/projs/sbpad/node_modules/sequelize/lib/dialects/abstract/query-generator.js:2004:13) at MySQLQueryGenerator.selectQuery (/home/bpad/projs/sbpad/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1356:27) at QueryInterface.select (/home/bpad/projs/sbpad/node_modules/sequelize/lib/query-interface.js:1127:27) at /home/bpad/projs/sbpad/node_modules/sequelize/lib/model.js:1759:34 at tryCatcher (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/util.js:16:23) at Promise._settlePromiseFromHandler (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/promise.js:547:31) at Promise._settlePromise (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/promise.js:604:18) at Promise._settlePromise0 (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/promise.js:649:10) at Promise._settlePromises (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/promise.js:729:18) at _drainQueueStep (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/async.js:93:12) at _drainQueue (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/async.js:86:9) at Async._drainQueues (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/async.js:102:5) at Immediate.Async.drainQueues [as _onImmediate] (/home/bpad/projs/sbpad/node_modules/bluebird/js/release/async.js:15:14) at processImmediate (internal/timers.js:439:21)

Executing (default): SELECT count(*) AS count FROM crashreports AS crashreports;

This is where i'm stuck, as while I know for sure it's in the "breakpad.get '/crashreports', .." part of the code; and I think it's the "Crashreport.findAndCountAll(findAllQuery).then..." part. I just am not sure what to do next. I don't know anything about coffeescript, nor sequelize.

ewongbb commented 3 years ago

After much logging and wrangling, I have come to the conclusion that a change in sequelize version had changed the required format of the 'order' field as well as the attributes in the "breakpad.get '/crashreports'" block.

The required changes were (for sequelize 5.22.4):

breakpad.use paginate.middleware(10, 50)
@@ -266,20 +267,22 @@ run = ->
     offset = req.offset
     page = req.query.page

-    attributes = []
+    attributes = ['*']

     # only fetch non-blob attributes to speed up the query
     for name, value of Crashreport.attributes
-      unless value.type instanceof Sequelize.BLOB
+      unless value.type instanceof Sequelize.BLOB('long')
         attributes.push name

     findAllQuery =
-      order: 'created_at DESC'
+      order: [['created_at', 'DESC']]
       limit: limit
       offset: offset
       attributes: attributes

Apparently, the order field has to be a list of lists. The attributes has to at least be "*".

With these changes, the crashreports would display.