Почему этот код отлично работает как промежуточное программное обеспечение, а не как функция?

#javascript #node.js #module

#javascript #node.js #модуль

Вопрос:

Этот код работает нормально, если он запущен в этом вопросе:

 app.route('/upload').post(rulesUpload.upload(obj),function (request, response, next) {
    response.status(200).end('File Caricato/i Con Successo');
});
 

и нет, если я напишу:

 app.route('/upload').post(function(request, response, next) {
  rulesUpload.upload(obj);
  response.status(200).end('File Caricato/i Con Successo');
});


var  formidable  =  require('formidable'),
      util  =  require('util'),
      fs    =  require('fs-extra');
var defaultMaxSize = 3;
var defaultMaxFiles = 1;

exports.upload = function(obj) {
  return function(req, res, cb) {
    var check = '';
    var errors = {};
    for (key in req.files) {
      if ((obj.required != undefined amp;amp; req.files[key].size == 0) amp;amp; (obj.required[key] != undefined amp;amp; obj.required[key]))
        check = "Il file "   key   " è obbligatorio!";
      else if (obj.destination[key] == undefined)
        check = 'Il file '   key   ' non è gestito correttamente.';
      else if (obj.files[key] != undefined amp;amp; obj.files[key] < req.files[key].length)
        check = 'Non si possono inserire più di '   obj.files[key]   ' file per il campo '   key;
      else if (obj.files[key] == undefined amp;amp; defaultMaxFiles < req.files[key].length)
        check = 'Non si possono inserire più di '   defaultMaxFiles   ' file per il campo '   key;
      else {                
        var  new_location  =  obj.destination[key]   '/';
        var numFiles = 1;
        if (req.files[key].length != undefined)
          numFiles = req.files[key].length;
        if (numFiles == 1)
          req.files[key] = {
            0: req.files[key]
          };

                    
        for (var  i  =  0;  i  < numFiles;  i  )  {                
          var  file_name  = '';
          if (obj.filename[key] != undefined) {
            file_name = obj.filename[key].name;
            if (file_name == undefined)
              file_name = req.files[key][i].name.substring(0, req.files[key][i].name.lastIndexOf("."));
            if (obj.filename[key].prefix != undefined)
              file_name = obj.filename[key].prefix   file_name;
            if (obj.filename[key].suffix != undefined)
              file_name  = obj.filename[key].suffix;
            file_name  = req.files[key][i].name.substring(req.files[key][i].name.lastIndexOf('.'), req.files[key][i].name.length);
          } else file_name = req.files[key][i].name;
          if (obj.fileTypes[key] != undefined) {
            var re = new RegExp(obj.fileTypes[key]);
            var mimetype = re.test(req.files[key][i].type);
            var extname = re.test(req.files[key][i].name.toLowerCase());
            if (!mimetype amp;amp; !extname)
              check = "Sono Accettate solo le seguenti estensioni: "   obj.fileTypes[key]   " per il campo "   key;
          }
          if (obj.fileSize[key] != undefined amp;amp; req.files[key][i].size > obj.fileSize[key] * 1024 * 1024)
            check = 'I file '   key   ' non possono superare i '   obj.fileSize[key]   " MB";
          if (obj.fileSize[key] == undefined amp;amp; req.files[key][i].size > defaultMaxSize * 1024 * 1024)
            check = 'I file '   key   ' non possono superare di default i '   defaultMaxSize   " MB";
          if (check == '') {                
            var  temp_path  =  req.files[key][i].path;

                            
            fs.move(temp_path,  new_location     file_name,  function (err)  {                    
              if  (err)  {                    } 
              else  {                    }                
            });
          } else {
            errors[key] = check;
          }
          if (check != "")
            errors[key] = check;

        }
        if (check != "")
          errors[key] = check;
      }
      if (check != "")
        errors[key] = check;
      check = '';            
    }
    if (check != "")
      errors[key] = check;
    check = '';
    if (errors != {})
      return cb(util.inspect(errors));
    else return cb(null);        
  };
  return;
};
 

P.S.: Для суперпользователей я знаю, что на этапе возврата есть ошибка, но я не нашел никакого решения, и это вторичная проблема.

P.S.2: Для любопытных, я использую этот код для проверки, могут ли отправленные файлы быть загружены или нет.

Комментарии:

1. Ваш метод возвращает функцию, поэтому было бы rulesUpload.upload(obj)(request, response, next);

Ответ №1:

Потому что вам нужно писать асинхронный код с помощью nodejs .. промежуточное программное обеспечение принимает запрос, ответ и обратный вызов, а после завершения работы передает его следующему промежуточному программному обеспечению…

Прочитайте, что возвращает функция загрузки, она возвращает функцию, которая является промежуточным программным обеспечением..

 app.route('/upload').post(middleware1, middleware2, ..., callback)
 

поэтому, если вы хотите напрямую обрабатывать загрузку в своем обратном вызове, вы должны вызвать его, а затем передать ему другую функцию.

 app.route('/upload').post(function (request, response, next) {
    rulesUpload.upload(obj)(request, response, function(err) {
         if (!err) {
           return response.status(200).end('File Caricato/i Con Successo');
         } else {
           // do something with the err..
         }
    });
});
 

Так что эти коды становятся все более сложными.. так что используйте промежуточное программное обеспечение)

Комментарии:

1. Я знаю, что это сложнее, но иногда это не работает, потому что я должен передать переменную из функции в другую! Однако спасибо!

2. Однако ваш код возвращает, что ответ не определен! Почему?

3. не уверен, что вы имеете в виду, вы все равно должны использовать подход промежуточного программного обеспечения. приведенный выше код не тестировался, просто чтобы дать вам представление об асинхронном стиле nodejs и промежуточного программного обеспечения

4. Ну, я должен вставить строку в свою базу данных, а затем передать переменную (идентификатор) в функцию загрузки… Если я правильно понимаю, если я сделал что-то вроде .post(createNewUser(),upload()) node.js попробуйте выполнить эти методы одновременно, чтобы у меня это не сработало…

Ответ №2:

Потому что вы вызываете upload как функцию синхронизации, но она асинхронна из-за fs.move . Кроме того, ваш вызов возвращает функцию. Просто передайте обратный вызов вашей функции и вызовите ее следующим образом :

 rulesUpload.upload(obj, function(){
 response.status(200).end('File Caricato/i Con Successo');
})
 

И измените прототип на :

 exports.upload = function(obj, cb) {
 // return function(req, res, cb) { // REMOVE THIS LINE
 

Комментарии:

1. Существует проблема … сначала приложение возвращает то, что не находит запрос, затем, после того, как я добавил запрос между параметрами в модуль, возвращает, что cb не является функцией

2. я не видел, чтобы вы использовали req, поэтому замените prototype на exports.upload = function(req, res, obj, cb) и вызовите его с помощью exports.upload(req, res, obj, function(){ Но что такое job ?? кажется, это никогда не было определено

3. Я использовал этот модуль также для управления созданием нового пользователя, поэтому он должен вызываться после создания строки в базе данных …