2
votes

Qu'est-ce que cb dans multer?

Dans le code ci-dessous, à partir de l'API multer, les options de destination et de nom de fichier sont des fonctions anonymes. Ces deux fonctions ont un argument appelé cb . Ces fonctions de rappel sont-elles définies dans le module multer quelque part ou suis-je censé les fournir?

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 }


0 commentaires

3 Réponses :


1
votes

Réponse courte: Vous fournissez le rappel.

cb est une fonction de rappel qui accepte 2 paramètres.

vous pouvez voir cela dans un scénario d'utilisation pour l'une ou l'autre des méthodes. Comme ...

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

Veuillez comprendre que je ne sais pas à quoi devraient ressembler les paramètres "req" ou "file", alors j'ai juste inventé quelque chose pour l'exemple.


6 commentaires

Dans le code que j'ai cité de l'API, la destination et le nom de fichier utilisent cb. Dans une situation réelle, probablement deux fonctions différentes avec des noms différents seraient nécessaires comme destinationCb et filenameCb?


Dans ce contexte, cb est une variable d'instance pour cette fonction. "cb" pour une méthode n'est pas la même chose que "cb" pour l'autre car il est défini lorsque la fonction est appelée.


En lisant la documentation de Multer, il semble qu'ils fournissent le rappel pour que vous puissiez gérer les fichiers stockés. Vous appelez storage.destination () et le rappel est le code qui s'exécute et inclut les informations sur le fichier dont vous avez besoin pour faire ce que vous voulez avec le fichier en stockage. Le rappel apparaît facultatif.


Donc je peux soit le laisser comme cb et une fonction dans le module multer sera utilisée, soit je peux définir ma propre fonction avec un nom différent et l'utiliser à la place?


J'ai besoin de lire beaucoup plus sur Multer pour bien comprendre ce qu'ils font ici. Le code consiste à configurer la destination et le nom de fichier d'un fichier en cours de téléchargement, mais je n'ai pas vu d'exemple utilisant ces méthodes directement. C'est probablement pourquoi vous demandez si vous devez fournir le rappel ou si l'API le fait. À ce stade, je ne peux pas répondre à cela.


Je suis aux prises avec un certain nombre de choses et cela semble toujours revenir aux rappels à la fin. Je comprends en quelque sorte des exemples simples, mais dans le contexte de quelque chose comme multer, je finis par être confus.



2
votes

Remarque: je ne sais pas ce qu'est multer

disons que vous avez une fonction,

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

Maintenant, dans votre code, vous appelez cette fonction avec deux arguments

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

Et maintenant, si vous avez besoin d'exécuter immédiatement une autre fonction après la fin de la fonction ci-dessus, vous devez avoir une fonction de rappel. Disons que vous devez console.log ('Hello world') après la fin de la fonction de destination,

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

Je suis sûr que vous connaissez ce type des fonctions. Maintenant, le problème est que la fonction de destination n'accepte que 2 arguments, nous devons donc ajouter un autre argument à la définition de la fonction. Appelons le troisième argument comme 'cb'

destination(req, files);

Maintenant quel est le type de cb? Cela devrait être une fonction. n'est-ce pas? donc si le troisième argument est une fonction, nous devons exécuter cette fonction cb quelque part. Le meilleur endroit pour exécuter la fonction cb est après tout le code à l'intérieur de la fonction de destination.

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

Et ici, nous avons une fonction de rappel !! Si vous réfléchissez profondément, vous comprendrez pourquoi ils ont introduit les promesses javaScript


0 commentaires

3
votes

La réponse est: oui cb est fourni par multer. Et oui, c'est une documentation bizarre qui n'en dit rien.

Ce rappel est ce que l'on appelle la fonction d'erreur en premier. Ainsi, lors de l'examen de la demande , ou du fichier , vous pouvez décider que l'utilisateur a téléversé quelque chose de mal, passez nouvelle erreur ( ) comme premier argument, et il sera renvoyé en réponse. Notez cependant que cela déclenchera une exception non gérée dans votre application. Je préfère donc toujours transmettre null et gérer l'entrée utilisateur dans le contrôleur correspondant.

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
});


0 commentaires