【问题标题】:Express, Nodejs use Multer for different ServicesExpress、Nodejs 将 Multer 用于不同的服务
【发布时间】:2019-02-09 08:42:01
【问题描述】:

我正在使用 express 服务器和 multer 在不同的服务(本地、azure、cloudinary、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 设置了什么。 现在您可以考虑上一个条件中提到的“本地”文件上传。

【问题讨论】:

    标签: node.js express multer


    【解决方案1】:

    问题是你在路由器之前调用了一次方法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) 
    

    【讨论】:

    • 我也更新了,但是调用multer后,回调函数没有调用,如何解决这个问题?
    • 作为 getActiveMulterService() 返回配置,我没有从这个函数调用 next()。
    • getActiveMulterService 函数返回multerMiddleware
    • 执行getActiveMulterService()后,回调函数没有调用。所以我看不到我们在回调中添加的控制台。
    • 是的,你是对的,结果 multer 没有启动。作为一个不好的选择 - 这是在更新的答案中。好的 - multer 不应该被退回,而是使用函数 getActiveMulterService 中的参数运行。
    【解决方案2】:

    您好,这在很大程度上已经得到了回答。解决方案是在此过程中手动将您的文件对象添加回您的 req.body 对象。

    找到完整解决方案here

    【讨论】:

      猜你喜欢
      • 2015-12-13
      • 2018-07-21
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2015-03-09
      相关资源
      最近更新 更多