Javascript 穆特的cb是什么?

Javascript 穆特的cb是什么?,javascript,node.js,express,multer,Javascript,Node.js,Express,Multer,在下面的代码中,从MulterAPI中,目标和文件名选项都是匿名函数。这两个函数都有一个名为cb的参数。这些回调函数是在multer模块中的某个地方定义的还是我应该提供它们 var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, '/tmp/my-uploads') }, filename: function (req, file, cb) { cb(nul

在下面的代码中,从MulterAPI中,目标和文件名选项都是匿名函数。这两个函数都有一个名为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 }

简短回答:您提供回调

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”参数应该是什么样子,所以我只是编了一些例子。

注意:我不知道multer是什么

假设你有一个函数

 function destination(req, files){
    //something happen here
 }
destination(req, files , function(){
    console.log('hello world')
});
现在在代码中,您使用两个参数调用此函数

destination(req, files);
现在,如果您需要在完成上述函数后立即执行另一个函数,那么您需要一个回调函数。 假设您在完成目标函数后需要
console.log('Hello world')

 function destination(req, files){
    //something happen here
 }
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承诺,答案是:是的,cb由multer提供。是的,这很奇怪,文档中什么也没说。

此回调是一个所谓的错误优先函数,因此在检查req文件时,您可能会确定用户上载了错误的内容,将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
});

在我从API引用的代码中,目标和文件名都使用cb。在实际情况下,可能需要两个具有不同名称的不同函数,如destinationCb和filenameCb?在此上下文中,cb是该函数的实例变量。一个方法的“cb”与另一个方法的“cb”不同,因为它是在调用函数时定义的。阅读Multer的文档,它们似乎为您提供了回调来处理存储中的文件。您可以调用storage.destination(),回调是执行的代码,它包含了您需要对存储中的文件执行所需操作的文件的相关信息。回调看起来是可选的。因此,我可以将其保留为cb并使用multer模块中的函数,或者我可以用不同的名称定义自己的函数并使用它?我需要阅读更多关于multer的内容,以完全理解他们在这里做什么。代码是为正在上载的文件配置目标和文件名,但我没有看到直接使用这些方法的示例。这可能就是您询问是否需要提供回调或API是否提供回调的原因。在这一点上,我不能回答这个问题。好问题。。真的不清楚