Express, Nodejs используют Multer для разных Сервисов - PullRequest
0 голосов
/ 04 сентября 2018

Я использую экспресс-сервер и мультитер для загрузки файлов на разные сервисы (локальные, лазурные, облачные, amazon s3 и т. Д.). Для этого я использую различные модули multer multer-azure, multer-cloudinary и т. Д.

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

Я могу вызвать запрос к базе данных, но когда я пытаюсь вызвать функцию multer, параметр req становится пустым. Вот что я делаю.

var multerUtility = require('./upload/multer.utility');
let multer = new multerUtility().getActiveMulterService();
router.post('/', getMetadataConfiguration, multer, (req, res, next) => {
  console.log('========== req ==========', req.file); // It is coming blank
  console.log('========== req ==========', req.body); // It is coming blank
});

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

function getMetadataConfiguration(res, req, next) {
  var conn = new jsforce.Connection({
    loginUrl : config.org_url,
  });
  var records = [];
  conn.login(username, password, function(err, userInfo) {
    if (err) {
      return console.error(err);
    }
    conn.query("query", (err, result) => {
      if(err) {
        res.status(500).send(err);
      }
      console.log('=========== result=========', result);
      req.serviceConfig = result.records[0];
      next();
    });
  });
}

А вот мой класс MulterUtility для обработки конфигурации: upload/multer.utility.js

class MulterUtility {
  constructor() {
  }

  getActiveMulterService(req, res, next) {
    var multerConfiguration;
    if(req.serviceConfig.service == 'azure') {
      multerConfiguration = multer({
        storage: multerAzure({
          connectionString: config.azure.connectionString,
          account: config.azure.account,
          key: config.azure.key,
          container: config.azure.container
        })
      }).single('image');
    } else if(req.serviceConfig.service == 'cloudinary') {
      multerConfiguration = multer({
        storage: cloudinaryStorage({
          cloudinary: cloudinary,
          folder: config.storageFolder
          // allowedFormats: ['jpg', 'png', 'jpeg']
        })
      }).single('image');
    } else if(req.serviceConfig.service === 'amazon') {
      multerConfiguration = multer({
        storage: multerS3({
          s3: s3,
          bucket: 'mycontainer',
          acl: 'public-read',
          contentType: multerS3.AUTO_CONTENT_TYPE,
          metadata: function (req, file, cb) {
            cb(null, {fieldName: file.fieldname});
          },
          key: function (req, file, cb) {
            cb(null, Date.now().toString() + '-' + file.originalname)
          }
        })
      }).single('image');
    } else if(req.serviceConfig.service === 'local') {
      multerConfiguration = multer({
        storage: multer.memoryStorage()
      }).single('image');
    }
    return multerConfiguration;
  }
}

module.exports = MulterUtility;

После выполнения multer я не получаю параметры req.file или req.body, которые устанавливает multer после загрузки файла. На данный момент вы можете рассмотреть загрузку локального файла, как указано в последнем условии.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Проблема в том, что вы вызываете метод getActiveMulterService один раз перед маршрутизатором. Но вам нужно называть это для каждого post. Попробуйте что-то вроде этого:

var multerUtility = require('./upload/multer.utility');
let multers = new multerUtility();
router.post('/', 
    getMetadataConfiguration, 
    (req, res, next) => multers.getActiveMulterService(req, res, next)(req, res, next), 
    (req, res, next) => {
      console.log('========== req ==========', req.file); // It is coming blank
      console.log('========== req ==========', req.body); // It is coming blank
    });

И в этой функции у вас есть аргументы в неправильном порядке:

getMetadataConfiguration(res, req, next)
// ==>
getMetadataConfiguration(req, res, next) 
0 голосов
/ 04 сентября 2018

Привет, на это уже во многом уже ответили. Решением является ручное добавление вашего файлового объекта обратно в ваш объект req.body во время процесса.

Полное решение найдено здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...