【问题标题】:What is the null argument to cb in multer?multer中cb的空参数是什么?
【发布时间】:2019-09-19 13:49:37
【问题描述】:

在下面的代码中,来自 multer API 的两个 cb 函数将 null 作为它们的第一个参数。 null 的意义是什么,这里除了 null 还可以使用哪些其他值?

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/tmp/my-uploads')
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now())
  }
})

var upload = multer({ storage: storage }

【问题讨论】:

  • 通常在使用回调时,将回调的第一个参数设置为错误状态是一种常见的做法。例如。 callback(new Error("oops something went wrong"));

标签: javascript node.js express multer


【解决方案1】:

接受回调的异步函数通常格式化回调,这样提供给回调的第一个参数是错误,如果遇到任何错误,而第二个参数是成功检索的值(如果没有遇到错误)。这正是这里发生的事情。如果destinationfilename 涉及可能引发错误的内容,则传递给cb 的第一个参数可能是错误,例如:

destination: function (req, file, cb) {
  if (!authorized) {
    cb(new Error('You are not authorized to do this!'));
    return;
  }
  cb(null, '/tmp/my-uploads')
}

原因是,如果第一个参数是错误,则通过 cb 的模块被激励使用和检查第一个参数,从而允许正确的错误处理。

如果错误作为 second 参数传递,例如,懒惰的程序员很容易忽略它,并定义回调使其只查看第一个参数。

【讨论】:

    【解决方案2】:

    这是在 Node.JS 核心和在其生态系统中开发的库的早期建立的错误优先回调模式。它仍然是一种常见的模式,但主要被诸如 promises 或 async/await 之类的东西所包含。以下是 Node.JS 文档 https://nodejs.org/api/errors.html#errors_error_first_callbacks 中的相关部分。

    null 以外的其他选项将是某种类型的 Error 的实例。

    【讨论】:

      【解决方案3】:

      null 表示没有错误,您正在调用回调并成功完成并返回结果值。

      node.js 异步回调约定适用于带有两个参数的回调,如果它是已声明的函数,则如下所示:

      function someCallbackFunction(err, value) {
          if (err) {
              // process err here
          } else {
              // no error, process value here
          }
      }
      

      第一个参数是错误(null如果没有错误,通常是Error对象的实例如果有错误)。第二个是一个值(如果没有错误)。

      因此,当没有错误时,您将null 作为第一个参数传递,而第二个参数将包含您的值。

      仅供参考,此回调样式有 node.js documentation

      【讨论】:

        猜你喜欢
        • 2019-09-19
        • 2021-04-29
        • 2014-12-20
        • 2018-12-21
        • 2021-10-24
        • 2016-05-20
        • 1970-01-01
        • 2017-06-04
        • 2014-02-09
        相关资源
        最近更新 更多