Error: job x doesnt exist - node.js

Is someone know why this issue my appears and how to catch it? I do not remove any jobs manually, use only .removeOnComplete(true) I have some different job processor for the same job task with different parameters. May it cause the issue? How to be in this case?
queue.create('task', jobData)
.removeOnComplete(true)
.priority('normal')
.attempts(3)
.save()
queue.process('task', 5, function (job, ctx, done) {
// First task prcessor
});
queue.process('task', 5, function (job, ctx, done) {
// Second task prcessor
});
Error:
Error: job "425596" doesnt exist
at Command.callback (/home/carmod/www/avitoparser/bundle/programs/server/npm/node_modules/kue/lib/queue/job.js:178:17)
at normal_reply (/home/carmod/www/avitoparser/bundle/programs/server/npm/node_modules/redis/index.js:714:21)
at RedisClient.return_reply (/home/carmod/www/avitoparser/bundle/programs/server/npm/node_modules/redis/index.js:816:9)
at JavascriptRedisParser.Parser.returnReply (/home/carmod/www/avitoparser/bundle/programs/server/npm/node_modules/redis/index.js:188:18)
at JavascriptRedisParser.execute (/home/carmod/www/avitoparser/bundle/programs/server/npm/node_modules/redis-parser/lib/parser.js:415:12)
at Socket.<anonymous> (/home/carmod/www/avitoparser/bundle/programs/server/npm/node_modules/redis/index.js:267:27)
at emitOne (events.js:77:13)
at Socket.emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:153:18)
at Socket.Readable.push (_stream_readable.js:111:10)

Related

How to handle mongodb nodejs error in find

I call collection.find(someBadQuery) and I get an error from MongoDB. But it ends up as unhandled rejection. How to handle this rejection?
As described in docs For find() MongoDB NodeJS driver returns FindCursor and not promise, therefore .catch(), or async try ... catch will not work. It is EventEmmiter, but there is no error event.
Is there any way how to track which .find() call caused the error?
The error is for example:
Unhandled rejection: MongoServerError: E11000 duplicate key error collection: data.Users__UserRole index: title_1 dup key: { title: null }
at ...\node_modules\mongodb\lib\operations\insert.js:53:33
at ...\node_modules\mongodb\lib\cmap\connection_pool.js:277:25
at ...
at handleOperationResult (...\node_modules\mongodb\lib\sdam\server.js:335:20)
at Connection.onMessage (...\node_modules\mongodb\lib\cmap\connection.js:222:9)
at MessageStream.<anonymous> (...\node_modules\mongodb\lib\cmap\connection.js:63:60)
at MessageStream.emit (node:events:513:28)
at processIncomingData (...\node_modules\mongodb\lib\cmap\message_stream.js:132:20)
at MessageStream._write (...\node_modules\mongodb\lib\cmap\message_stream.js:33:9)
at writeOrBuffer (node:internal/streams/writable:391:12)
at _write (node:internal/streams/writable:332:10)
at MessageStream.Writable.write (node:internal/streams/writable:336:10)
at Socket.ondata (node:internal/streams/readable:754:22)
at Socket.emit (node:events:513:28)
at addChunk (node:internal/streams/readable:315:12)
at readableAddChunk (node:internal/streams/readable:289:9)
at Socket.Readable.push (node:internal/streams/readable:228:10)
at TCP.onStreamRead (node:internal/stream_base_commons:190:23)
at TCP.callbackTrampoline (node:internal/async_hooks:130:17) {
So how can I prevent unhandled rejections and actually trace query which causes the error? Where should I put error handler?
Thanks.
To get Promise you need to call .toArray() on that FindCursor.
const findResult = await collection.find({}).toArray();
console.log('Found documents =>', findResult);
as mentioned in docs

How to parse error parameter in request callback?

I'm deliberately triggering an error in a stored procedure under certain conditions which I want to catch in my Node.js API which uses the Tedious package.
Code Snippet from API:
let request = new Request(sql, (err)=>{
if (err) {
sqlerr = err;
console.log(typeof(err));
console.log("**RQ-ERROR**", err);
}
});
In the callback of the "Request" object above there is an "err" parameter. The "typeof()" returns "object"; however, when I dump it to the console it looks like this:
**RQ-ERROR** { RequestError: Duplicate entry for specified period
at RequestError (C:\inetpub\wwwroot\PersonnelApps\kudosapi\node_modules\tedious\lib\errors.js:32:12)
at Parser.tokenStreamParser.on.token (C:\inetpub\wwwroot\PersonnelApps\kudosapi\node_modules\tedious\lib\connection.js:723:34)
at emitOne (events.js:96:13)
at Parser.emit (events.js:188:7)
at Parser.parser.on.token (C:\inetpub\wwwroot\PersonnelApps\kudosapi\node_modules\tedious\lib\token\token-stream-parser.js:27:14)
at emitOne (events.js:96:13)
at Parser.emit (events.js:188:7)
at addChunk (C:\inetpub\wwwroot\PersonnelApps\kudosapi\node_modules\readable-stream\lib\_stream_readable.js:297:12)
at readableAddChunk (C:\inetpub\wwwroot\PersonnelApps\kudosapi\node_modules\readable-stream\lib\_stream_readable.js:279:11)
at Parser.Readable.push (C:\inetpub\wwwroot\PersonnelApps\kudosapi\node_modules\readable-stream\lib\_stream_readable.js:240:10)
message: 'Duplicate entry for specified period',
code: 'EREQUEST',
number: 50000,
state: 1,
class: 16,
serverName: 'PERSODG2LNN52\\SQLEXPRESS',
procName: 'CreateStatusReport',
lineNumber: 44 }
This almost looks like a JavaScript object but, as you can see, the "RequestError" data isn't quoted nor is there a comma after the text "240:10)" just before the "message" member. I'm not sure if this is a bug in TDS or if I'm just missing something but I cannot access any of the members as it is. I'd have to convert it to a string and parse it which is fine but isn't very elegant.
Suggestions?
as you can see, the "RequestError" data isn't quoted nor is there a comma after the text "240:10)"
These are artifacts of the console logging out the error message. You can try it out for yourself with something like the following:
$ node
> console.log(new Error('this is an error object!'));
Error: this is an error object!
at repl:1:13
at Script.runInThisContext (vm.js:119:20)
at REPLServer.defaultEval (repl.js:332:29)
at bound (domain.js:395:14)
at REPLServer.runBound [as eval] (domain.js:408:12)
at REPLServer.onLine (repl.js:639:10)
at REPLServer.emit (events.js:194:15)
at REPLServer.EventEmitter.emit (domain.js:441:20)
at REPLServer.Interface._onLine (readline.js:290:10)
at REPLServer.Interface._line (readline.js:638:8)
I'm not exactly sure what the desired outcome of this question is, but try inspecting the err.message property rather than using the typeof operator.

node connect-timeout: how to suppress "ServiceUnavailableError: Response timeout" log message

I'm using the connect-timeout module. When the timeout fires, it seems to dump the following error message to the console:
ServiceUnavailableError: Response timeout
at IncomingMessage.<anonymous> (/app/node_modules/connect-timeout/index.js:75:8)
at emitOne (events.js:96:13)
at IncomingMessage.emit (events.js:188:7)
at Timeout._onTimeout (/app/node_modules/connect-timeout/index.js:48:11)
at ontimeout (timers.js:365:14)
at tryOnTimeout (timers.js:237:5)
at Timer.listOnTimeout (timers.js:207:5)
How do I suppress these log messages? I don't particularly want to see them, because the timeout firing is not really an indicator that there is a problem... it's just doing its job. And this is especially because I can add my own error handling middleware to express that can pick and choose what (if anything) to do with the error.
You need to catch this from express, the code should look like:
function errorHandler (err, req, res, next) {
console.log("Oops")
}
app.use(errorHandler)
For more info:
https://expressjs.com/en/guide/error-handling.html

Neo4j's NPM component blows up without error

I'm using the thingdom/node-neo4j module like this:
var neo = require('neo4j');
var db = new new.GraphDatabase(...);
but when I call the cypher method with some invalid script, instead of returning an error (allowing me to handle it), it blows up:
db.cypher('// invalid cypher script', (err, res) => {
if (err) console.log('ERROR: ' + err);
console.log(res);
})
what I get is a stack trace that looks like this:
/Users/ekkis/dev/test/inc/node_modules/neo4j/lib-new/errors.js:20
Error.captureStackTrace(this, this.constructor);
^
TypeError: Error.captureStackTrace is not a function
at ClientError.Error [as constructor] (/Users/ekkis/dev/test/inc/node_modules/neo4j/lib-new/errors.js:20:13)
at new ClientError (/Users/ekkis/dev/test/inc/node_modules/neo4j/lib-new/errors.js:81:48)
at Function.__dirname.Error.Error._fromObject (/Users/ekkis/dev/test/inc/node_modules/neo4j/lib-new/errors.js:70:14)
at /Users/ekkis/dev/test/inc/node_modules/neo4j/lib-new/GraphDatabase.js:302:25
at Request._callback (/Users/ekkis/dev/test/inc/node_modules/neo4j/lib-new/GraphDatabase.js:92:20)
at Request.self.callback (/Users/ekkis/dev/test/inc/node_modules/request/request.js:187:22)
at emitTwo (events.js:106:13)
at Request.emit (events.js:191:7)
at Request. (/Users/ekkis/dev/test/inc/node_modules/request/request.js:969:12)
at emitNone (events.js:91:20)
at IncomingMessage.emit (events.js:185:7)
at endReadableNT (_stream_readable.js:974:12)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickCallback (internal/process/next_tick.js:98:9)
I'm using node v7.3.0 and posted an issue with the maintainer here: https://github.com/thingdom/node-neo4j/issues/214 but so far no solution. is anyone else running into this? any solutions?

How to not show stack trace in Gulp task error callback?

When I error out in one of my tasks:
gulp.task('foo', function(onDone) {
onDone('It did not work');
});
I get a large irrelevant stack trace:
[13:10:25] 'foo' errored after 4.27 s
[13:10:25] Error: It did not work
at formatError (C:\npm\node_modules\gulp\bin\gulp.js:169:10)
at Gulp.<anonymous> (C:\npm\node_modules\gulp\bin\gulp.js:195:15)
at emitOne (events.js:96:13)
at Gulp.emit (events.js:188:7)
at Gulp.Orchestrator._emitTaskDone (D:\Code\my-project\node_modules\orchestrator\index.js:264:8)
at D:\Code\my-project\node_modules\orchestrator\index.js:275:23
at finish (D:\Code\my-project\node_modules\orchestrator\lib\runTask.js:21:8)
at cb (D:\Code\my-project\node_modules\orchestrator\lib\runTask.js:29:3)
at D:\Code\my-project\gulp-tasks\insert-docs.js:116:25
at Request._callback (D:\Code\my-project\gulpfile.js:112:17)
How do I not show that? I'd prefer to use the in build gulp features rather than a third party module or console.error().
Gulp checks for the presence of a showStack property on Error objects passed to the callback. This was probably introduced to support that option on gutil.PluginError, but can be used with any Error object:
function withError(msg) {
var err = new Error(msg);
err.showStack = false;
return err;
}
gulp.task('foo', function(done) {
done(withError('It did not work'));
});

Resources