在node.js中处理错误

在node.js中,asynchronous函数有callback函数,但是只有一些函数有errparameter passing给函数。 例如fs.writeFile有错误的参数

fs.writeFile('message.txt', 'Hello Node', function (err) { if (err) throw err; console.log('It\'s saved!'); }); 

但fs.watchfile不

 fs.watchFile('message.text', function (curr, prev) { console.log('the current mtime is: ' + curr.mtime); console.log('the previous mtime was: ' + prev.mtime); }); 

第一个问题是为什么一些asynchronous函数在callback中有错误的参数,有些不是? 我们应该如何处理那些没有的错误呢?

另外,就同步函数而言,它们是否都发出了我们可以订阅的“错误”事件,并以这种方式处理错误?

 var rs = fs.createReadStream("C:\\Temp\\movie.mp4"); rs.on('error', function(err) { console.log('!error: ', err); }); 

和最后一个问题:大多数同步函数名称同步…为什么createReadStream不?

谢谢!

第一个问题是为什么一些asynchronous函数在callback中有错误的参数,有些不是? 我们应该如何处理那些没有的错误呢?

节点代码中绝大多数的asynchronous函数符合callback函数的第一个参数约定是错误的。 有一小部分例外,例如fs.exists ,明确logging为不应该在官方文档中使用的反模式。

特别是在watchFile的情况下,它只是API的语义,它重复地调用callback,并且只在成功时才因为这就是观察文件的意义,一般来说操作系统没有提供具有语义的机制“当这个文件系统path发生任何错误时通知我”,所以你有它。

另外,就同步函数而言,它们是否都发出了我们可以订阅的“错误”事件,并以这种方式处理错误?

不,你的节点机制分类是不完整的。 至less有4个主要的范例:

  • 同步代码。 大多抛出exception来指示错误,如JSON.parse但并非总是如此。 例如, parseInt返回NaN来指示错误。
  • asynchronous代码在callback风格。 一般将错误作为callback的第一个parameter passing。
  • asynchronous代码在事件发射器/stream风格。 通常会发出“错误”事件。
  • 使用promise的asynchronous代码。 不在节点核心中使用,但在社区中有一大群忠实的奉献者。 一般通过调用“拒绝”callback(这是传递给第二个参数的callback)来拒绝承诺。

大部分同步函数都有同步名称…为什么createReadStream不?

因为它不是真的同步。 这是基于事件发射器的stream媒体。 实际的createReadStream会同步返回你的stream对象,但是I / O是asynchronous的,事件不会开始被发射,直到最早的下一个打勾。

我强烈推荐在joyent博客上的Node.js中的error handling,以了解当前最佳实践。