我在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使用错误或预期对象以外的其他方式进行响应。
两个问题:
我应该检查if (!err)
是否是预期的对象,而不是检查body
?例如if (body.pairs !== undefined)
如何使用退出代码1阻止脚本退出这些类型的错误?该脚本使用7种不同的函数从7个API中提取数据,因此我希望退出特定的函数,其余函数继续执行。
所以:
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);