node.js - 如何捕获sendFile函数中的错误?

标签 node.js error-handling sendfile

在我的一条 route ,我想使用sendFile函数发送文件,但我想捕捉可能在send函数期间发生的错误。我写了这段代码,但是我抛出的错误没有被catch块和应用程序崩溃捕获:

try {
       res.sendFile(Path.join(__dirname, '../../uploads', fileName), null, (err) => {
           if (err) {
                throw err
           }
       })
} catch(err) {
       Logger.error(err);
       next(error);
}

如何捕获此错误?

最佳答案

这里基本上有四个选择:

  • 您可以在if (err) { ... }块中处理回调内部的错误。
  • 您可以从if (err) { ... }块内部调用一个回调,该回调可以通知其他代码。
  • 您设置了某种eventEmitter(例如流对象使用的事件),并在该对象上发出错误事件,而想要查看错误的代码将侦听该对象上的错误事件。
  • 您可以使用promise并拒绝调用代码可以监视的promise。

  • 您可能已经发现,回调内的throw err对您没有任何好处。它只是引发异步调用的res.sendFile()回调,您无法使用自己的代码捕获或监视该回调。这里的封闭函数已经返回,您显示的try/catch将不会捕获throw err,因为try/catch范围已经完成。

    在您的特定情况下,似乎可以执行以下操作:
       res.sendFile(Path.join(__dirname, '../../uploads', fileName), (err) => {
           if (err) {
                Logger.error(err);
                next(err);
           }
       });
    

    这是上面的选项1)。

    关于node.js - 如何捕获sendFile函数中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57195961/

    相关文章:

    JavaScript:res.sendFile 不是函数

    Linux >2.6.33 : could sendfile() be used to implement a faster 'cat' ?

    javascript - 在 Angular 2 应用程序中将一个属性传递给一个空的新对象

    javascript - 我可以向 Cheerio 选择器添加变量吗?

    node.js - 如何在 EJS View 中使用 Node 模块(如 MomentJS)?

    node.js - Mongoose 查询只保留 50 个文档

    c++ - 当阶乘对于 C++ 中的 int 来说太大时如何处理?

    android - 尝试将项目放入微调器时出错-Android

    angular - Angular 4.3 HttpClient : catch webapi error response body

    javascript - 启动 Angular 服务器时出错