2016-05-21 4 views
0

Первое, что я делаю, это отправить идентификатор папки с модулем загрузки ng-file.Почему не удается прочитать данные, отправленные вместе с файлами?

file.upload = Upload.upload({ 
    url: '/api/files/upload', 
    method: 'POST', 
    data: { 
     file: file, 
     folderId: currentFolder // This is the information I want to receive 
    } 
})...; 

Я получаю информацию по следующему маршруту:

router.route('/api/files/upload').post(files.uploadFiles); 

Тогда, когда я пытаюсь проверить информацию, идентификатор не существует!

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

Вот код для загрузки файла:

var path = require('path'); 
var fs = require('fs'); 
var mongoose = require('mongoose'); 
var _ = require('lodash'); 
var async = require('async'); 
var multer = require('multer'); 
var errorHandler = require('./errorhandler.server.controller.js'); 

var Files = mongoose.model('Files'); 

var storage = multer.diskStorage({ 
    destination: function(req, file, cb) { 
     // 
     // req.body.folderId EXISTS !!! 
     // but I don't understand why don't exist in the other places 
     // you can see the picture 2 
     // 
     cb(null, path.resolve(req.ubicacion)); 
    }, 
    filename: function(req, file, cb) { 
     cb(null, file.originalname); 
    } 
}); 

var upload = multer({ 
    storage: storage, 
    fileFilter: function(req, file, cb) { 
     // 
     // req.body.folderId doesn't exist 
     // 
     fs.exists(req.ubicacion + file.originalname, function(exists) { 
      if (exists) { 
       return cb(new Error('Ya existe ' + file.originalname)); 
      } 
      cb(null, true); 
     }); 
    } 
}).any(); 

/** 
* 
*/ 
exports.uploadFiles = function(req, res) { 
    async.waterfall([ 
     function(cb) { 
      // 
      // req.body.folderId doesn't exist 
      // you can see the picture 1 
      // 
      var id = req.body.folderId; 

      Files.findById(id, function(err, result) { 
       if (err) { 
        return cb(err); 
       } 
       req.ubicacion = result.ubicacion; 
       cb(null); 
      }); 
     }, 
     function(cb) { 
      upload(req, res, function(err) { 
       if (err) { 
        return cb(err); 
       } 
       cb(null); 
      }); 
     }, 
     function(cb) { 
      var file = new Files({}); 

      file.save(function(err, result) { 
       if (err) { 
        return cb(err); 
       } 
       cb(null, result); 
      }); 
     } 
    ], function(err, result) { 
     if (err) { 
      return res.status(400).send({ 
       err: errorHandler.getErrorMessage(err) 
      }); 
     } 
     res.status(201).json(result); 
    }); 
}; 

Picture 1 и Picture 2

ответ

0

Когда запрос HTTP сделан с содержанием, то req.body не заполняется с содержанием магическим, оно должно быть сделано вручную или использовать промежуточное программное обеспечение, чтобы сделать это вместо нас.

Для формы без файла body-parser является одним из наиболее используемых промежуточных программ, но он не обрабатывает многостраничную форму.

Промежуточное программное обеспечение multer делает это, когда в вашем коде вызывается функция с именем upload.

Это объясняет, почему в начале uploadFile, folderId не доступен, так как upload вызывается только после того, как в этой части кода:

upload(req, res, function(err) { 
    if (err) { 
     return cb(err); 
    } 
    cb(null); 
});