【问题标题】:What is cb in multer?multer中的cb是什么?
【发布时间】:2019-09-19 09:16:10
【问题描述】:

在下面的代码中,来自 multer API,目标和文件名选项都是匿名函数。这两个函数都有一个名为 cb 的参数。这些回调函数是在 multer 模块中定义的,还是我应该提供它们?

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 }

【问题讨论】:

  • 好问题.. 真的不清楚

标签: javascript node.js express multer


【解决方案1】:

答案是:是的,cb 是 multer 提供的。是的,奇怪的文档对此只字未提。

这个回调是所谓的错误优先函数,因此在检查 reqfile 时,您可能会决定,该用户上传了错误的内容,传递 new Error( ) 作为第一个参数,并将作为响应返回。但请注意,它会在您的应用程序中引发未处理的异常。所以我更喜欢始终传递 null 并在相应的控制器中处理用户输入。

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    const error = file.mimetype === 'image/jpeg'
      ? null
      : new Error('wrong file');
    cb(error, '/if-no-error-upload-file-to-this-directory');
  },
  //same for filename
});

【讨论】:

    【解决方案2】:

    注意:我不知道什么是multer

    假设你有一个函数,

     function destination(req, files){
        //something happen here
     }
    

    现在在您的代码中,您使用两个参数调用此函数

    destination(req, files);
    

    而现在如果你需要在上述函数完成后立即执行另一个函数,你需要一个回调函数。 假设您在完成目标功能后需要console.log('Hello world')

    destination(req, files , function(){
        console.log('hello world')
    });
    

    我相信你知道这种功能。现在的问题是目标函数只接受 2 个参数,所以我们需要在函数定义中添加另一个参数。让我们将第三个参数称为'cb'

     function destination(req, files, cb){
        //something happen here
     }
    

    现在 cb 的类型应该是什么?它应该是一个函数。不是吗? 所以如果第三个参数是一个函数,那么我们必须在某个地方执行这个 cb 函数。执行 cb 函数的最佳位置是在目标函数内的所有代码之后。

     function destination(req, files, cb){
        //something happen here
        cb();
     }
    

    这里我们有一个回调函数!!如果你深入思考你就会明白他们为什么要引入 javaScript Promises

    【讨论】:

      【解决方案3】:

      简短回答:您提供回调。

      cb 是一个接受 2 个参数的回调函数。

      您可以在任一方法的使用场景中看到这一点。比如……

      let req = true;
      let file = 'MyFile.txt';
      function myCallbackFunc = function(value1, value2){ console.log('my callback function'); };
      storage.filename(req, file, myCallbackFunc));
      

      请理解,我不知道“req”或“file”参数应该是什么样子,所以我只是为示例编了一些东西。

      【讨论】:

      • 在我从 API 引用的代码中,目标和文件名都使用 cb。在实际情况下,大概需要两个具有不同名称的不同函数,例如destinationCb 和filenameCb?
      • 在此上下文中,cb 是该函数的实例变量。一种方法的“cb”与另一种方法的“cb”不同,因为它是在调用函数时定义的。
      • 阅读 Multer 的文档,似乎他们正在为您提供回调来处理存储中的文件。您调用 storage.destination() ,回调是执行的代码,其中包含有关文件的信息,您需要对存储中的文件执行所需的操作。回调显示为可选。
      • 所以我可以将其保留为 cb 并使用 multer 模块中的函数,或者我可以使用不同的名称定义我自己的函数并使用它来代替?
      • 我需要阅读更多关于 Multer 的内容才能完全了解他们在这里所做的事情。该代码是为正在上传的文件配置目标和文件名,但我没有看到直接使用这些方法的示例。这可能就是您询问是否需要提供回调或 API 是否提供回调的原因。在这一点上,我无法回答。
      猜你喜欢
      • 2019-09-19
      • 2014-12-20
      • 2016-05-20
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多