javascript - NodeJS: How to handle promise rejection properly & best way to create logs -
i'm pretty new coding , node.js trying learn... first big difficulties found node.js think in async way when building code, i'm facing monster: promises.
up until now, i've tried build code work , not minding @ error handling (i know that's dumb, helps me learn) while running code errors time time.
since "my program" (for now) bunch of requests (using request-promise) being made through infinite loops. manipulation of info ({objects}) being received , sending mongodb (via mongoose), know errors coming from:
- the servers (being requested) returning error (
statuscode !== 200). - too many requests made (which specific
statuscode)
and code runs smoothly, until 1 of these errors. objective code handle these errors , create logs once occur. ideal function restart loop yielded error (request) once occur (maybe after settimeout or something).
my questions are:
- could recommend great material on
promiserejectionhandling dig into? i'm using.catch((err) => { foo })each promise, i'm not sure err once caught. - is there out there helps logs ,
promiserejectionhandling (an npm package maybe)? - how can handle
looprestart? again, i'm not expecting provide full response whole code (if can that's better) put me in right direction (best practices, famous npms or articles achieve this)!
i hope i'm not out of topic , following so's rule! if not let me know , i'll delete question or edit , adapt. in advance help!
******* edit ********
simplifying code:
[]./module/apirequest.js[]
var rq = require('request-promise'); var fs = require('fs'); function apirequest(params, req) { var date = new date().toisostring(); var logfilename = '../logs/[kraken]'+date+'errorlog.txt'; var options = { uri: `https://api.kraken.com/0/public/${params}`, qs: req, json: true, resolvewithfullresponse: true }; return rq(options).then((res) => { if (res.statuscode === 200 && !res.body.error.length) { return res; // <=== unknown param, server returns 200 error object. } else { fs.writefile(logfilename, res, function(err) { if (err) return console.log(err); // <==== since 200 won't appear error i'm trying handle way. console.log(`[error][kraken]: log created!`); }); } }).catch((err) => { // <==== far understand other error (statuscode 500 instance / or error related code) fs.writefile(logfilename, err, function(err) { if (err) return console.log(err); console.log(`[error][kraken]: log created!`); }); }); }; module.exports = { apirequest }; []./module/app.js[]
var apirequest = require('./apirequest.js').apirequest; function kraken(item) { return apirequest('ticker', {pair: item}).then((res) => { var result = {}; var timestamp = math.floor(new date()); object.keys(res.body.result).foreach((k) => { result= { mk: 'kraken', name: k, a: res.body.result[k].a, b: res.body.result[k].b, c: res.body.result[k].c, v: res.body.result[k].v, p: res.body.result[k].p, t: res.body.result[k].t, l: res.body.result[k].l, h: res.body.result[k].h, o: res.body.result[k].o, n: timestamp, } }); return result; // <=== occurs when there's no error in apirequest. }).catch((err) => { console.log(err); // <==== i'm not sure if gets error apirequest. if i'm not mistaken that's not case, it's error handler 'kraken' function i'm not sure kind of errors come out of this... }); }; module.exports = { kraken, } []./main.js[]
var fs = require('fs'); var mongo = require('mongodb'); var mongoose = require('mongoose'); mongoose.promise = global.promise; // kraken require: var kraken = require('./module/app.js').kraken; var krakentick = require('./module/model/krakenmodel').krakentick; //<=== model mongoose. async function loopkr() { settimeout( async function () { var item = ['xbtusd']; var data = await kraken(item); data.foreach((object) => { if (object.name === 'xxbtzusd') { var iname = 'btcusd' } else { var iname = 'n/a' }; var tick = new krakentick({ mk: object.mk, name: object.name, a: object.a, b: object.b, c: object.c, v: object.v, p: object.p, t: object.t, l: object.l, h: object.h, o: object.o, n: object.n, iname: iname, }); tick.save(function(err, tick) { if (err) return console.log(err); //<==== related mongoose not promise if i'm not mistaken... handling occur if had problem console.log(`[success][kraken]: ${tick.name} added db!`); }); }); loopkr(); } }, 1100); }; loopkr(); so can see, i'm trying handle errors coming out of request. how send them log (is current code correct? there better way?)? , after error arises , breaks loop, how restart loop automatically?
with code, errors not being handled properly... reasons following message:
typeerror: cannot read property 'body' of undefined @ apirequest.then (fast-crypto/module/app.js:34:22) @ trycatcher (fast-crypto/node_modules/bluebird/js/release/util.js:16:23) @ promise._settlepromisefromhandler (fast-crypto/node_modules/bluebird/js/release/promise.js:512:31) @ promise._settlepromise (fast-crypto/node_modules/bluebird/js/release/promise.js:569:18) @ promise._settlepromise0 (fast-crypto/node_modules/bluebird/js/release/promise.js:614:10) @ promise._settlepromises (fast-crypto/node_modules/bluebird/js/release/promise.js:693:18) @ async._drainqueue (fast-crypto/node_modules/bluebird/js/release/async.js:133:16) @ async._drainqueues (fast-crypto/node_modules/bluebird/js/release/async.js:143:10) @ immediate.async.drainqueues (fast-crypto/node_modules/bluebird/js/release/async.js:17:14) @ runcallback (timers.js:781:20) @ tryonimmediate (timers.js:743:5) @ processimmediate [as _immediatecallback] (timers.js:714:5) (node:12507) unhandledpromiserejectionwarning: unhandled promise rejection (rejection id: 1): typeerror: cannot read property 'name' of undefined (node:12507) [dep0018] deprecationwarning: unhandled promise rejections deprecated. in future, promise rejections not handled terminate node.js process non-zero exit code. { error: enoent: no such file or directory, open '../logs/[kraken]2017-08-20t10:58:03.302zerrorlog.txt' errno: -2, code: 'enoent', syscall: 'open', path: '../logs/[kraken]2017-08-20t10:58:03.302zerrorlog.txt' }
Comments
Post a Comment