javascript - node.js 中的错误处理

标签 javascript node.js error-handling

在 node.js 中,异步函数有回调,但只有其中一些有错误参数传递给该函数。 例如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);
});

第一个问题是为什么有些异步函数在回调中有 err 参数而有些没有? 我们应该如何处理那些不这样做的错误?

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

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

最后一个问题:大多数同步函数的名称中都有 Sync ... 为什么 createReadStream 没有?

谢谢!

最佳答案

First question is why some async functions have err argument in callback and some don't? How are we supposed to handle error of those which don't?

绝大多数 Node 代码中的异步函数都符合回调函数的第一个参数是错误的约定。有极少数异常(exception),例如 fs.exists ,这被明确记录为不应在官方文档中使用的反模式。

特别是在 watchFile 的情况下,它只是重复调用回调的 API 语义,并且只有在成功时才调用回调,因为这就是监视文件和一般操作系统的意义不要提供具有语义“当此文件系统路径出现任何问题时通知我”的机制,所以你有它。

Also, as far as synchronous functions are concerned, are they all emitting "error" event which we can subscribe to and handle error this way?

没有。您对 Node 机制的分类不完整。至少有4种主要范式:

  • 同步代码。大多数情况下会抛出异常以指示错误,例如 JSON.parse 但并非总是如此。例如,parseInt 返回 NaN 以指示错误。
  • 回调风格的异步代码。通常将错误作为第一个参数传递给回调。
  • 事件发射器/流式传输风格的异步代码。通常会发出“错误”事件。
  • 使用 promise 的异步代码。未在 Node 核心中使用,但在社区中拥有大量忠实的拥护者。通常通过调用传递给 .then 的第二个参数“reject”回调来拒绝 promise 。

most of synchronous functions have Sync in name... why createReadStream does not?

因为它不是真正同步的。它是基于事件发射器的流媒体。实际的 createReadStream 将同步返回流对象,但 I/O 是异步的,事件最早要到下一个滴答声才会开始。

我强烈推荐这篇文章Error Handling in Node.js在 joyent 博客上详细描述了当前的最佳实践。

关于javascript - node.js 中的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23125734/

相关文章:

javascript - Angular 应用程序转移到版本 6 错误 : 'Global is not defined'

javascript - 环回 IO OAuth 不起作用

css - Laravel 5.4 使用 composer 添加 zurb foundation 6.3.0

c - 我的代码没有捕获 c 中的空参数

ruby-on-rails - 如何处理 'record does not exist'错误并防止后台作业尝试重试?

c - C 中的线程 1 : EXC_BAD_ACCESS (code =1, 地址 = 0x0)

javascript - 是否可以通过解构从数组创建对象?

javascript - 尝试建立 Angular 项目时的业力问题

javascript - Firebase 安全问题/身份验证

node.js - 如何修复路由以在 node.js 的子文件夹中查找 View