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 promiserejection handling dig into? i'm using .catch((err) => { foo }) each promise, i'm not sure err once caught.
  • is there out there helps logs , promiserejection handling (an npm package maybe)?
  • how can handle loop restart? 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

Popular posts from this blog

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -