退出代码1后继续运行节点脚本

时间:2017-07-01 13:25:16

标签: node.js error-handling

我在NodeJS中有一个脚本,它从外部API中提取数据并将数据插入mongodb,每分钟运行一次。我正在使用forever模块运行脚本,以便在出现错误时尝试重新启动。

在我上床睡觉前我开始编写剧本,当我早上醒来时,控制台暂停了这个错误:

  

D:\ Dropbox(个人)\ coding \ cryptoDataApp \ scripts \ tickers.js:305           var currencyPairs = Object.keys(pairsObj);                                      ^

     

TypeError:无法将undefined或null转换为object       在Request._callback(D:\ Dropbox(Personal)\ coding \ cryptoDataApp \ scripts \ tickers.js:305:40)       在Request.self.callback(D:\ Dropbox(Personal)\ coding \ cryptoDataApp \ node_modules \ request \ request.js:123:22)       在emitTwo(events.js:106:13)       在Request.emit(events.js:191:7)       在请求。 (D:\ Dropbox(个人)\ coding \ cryptoDataApp \ node_modules \ request \ request.js:893:14)       在emitOne(events.js:101:20)       在Request.emit(events.js:188:7)       在IncomingMessage。 (D:\ Dropbox(Personal)\ coding \ cryptoDataApp \ node_modules \ request \ request.js:844:12)       在emitNone(events.js:91:20)       在IncomingMessage.emit(events.js:185:7)       at endReadableNT(_stream_readable.js:974:12)       at _combinedTickCallback(internal / process / next_tick.js:80:11)       at process._tickCallback(internal / process / next_tick.js:104:9)错误:永远检测到的脚本退出代码:1

在脚本运行几百次之后才发生此错误。

指的是这段代码:

new Promise(function(resolve, reject) {
  const apiUrl = 'https://api.liqui.io/api/3/info'
  request.get({
      url: apiUrl,
      timeout: 5000
    },
    function(err, res, body) {
      if (err) {
        console.log(err, 'liqui ticker update error')
        reject(err, 'liqui ticker update error')
      }
      if (!err) {

        body = JSON.parse(body)
        var pairsObj = body.pairs
        var currencyPairs = Object.keys(pairsObj); //pairsObj undefined or null here

        resolve(currencyPairs)
      }
    }
  )
})

我假设问题是API使用错误或预期对象以外的其他方式进行响应。

两个问题:

  1. 我应该检查if (!err)是否是预期的对象,而不是检查body?例如if (body.pairs !== undefined)

  2. 如何使用退出代码1阻止脚本退出这些类型的错误?该脚本使用7种不同的函数从7个API中提取数据,因此我希望退出特定的函数,其余函数继续执行。

  3. 所以:

    function fn60sec() {
      //get all ticker data
      getTickers.poloniex()
      getTickers.gdax()
      getTickers.bitfinex()
      getTickers.bitstamp()
      getTickers.bittrex()
      getTickers.liqui() //if this function exits, go on with the others
      getTickers.btce()
    }
    
    fn60sec();
    setInterval(fn60sec, 60 * 1000);

0 个答案:

没有答案