【问题标题】:Node multer in routes路由中的节点多路器
【发布时间】:2015-08-02 02:49:57
【问题描述】:

我的 app.js 中有 multer,例如:

var multer  = require('multer');
app.use(multer({ dest: './public/img/profile/',
 rename: function (fieldname, filename) {
    return fieldname;
  },
onFileUploadStart: function (file) {
  console.log(file.originalname + ' is starting ...')
},
limits: {
  files: 1
},
onFileUploadComplete: function (file) {
  console.log(file.fieldname + ' uploaded to  ' + file.path)
  imageUploaded=true;
}
}));

这可行,但我想在特定路线中设置这些设置。例如 imageRoute.js 而不是我的 app.js。但是我应该使用什么来代替 app.use() 而不是因为我无法在我的路线中访问应用程序。我在我的 app.js 中创建路由,例如:

  var imageRoutes  = require('./routes/imageRoutes')();
  app.use('/image', imageRoutes);

imageRoutes.js

module.exports = function(passport) {

var that = this;

// Modules
var express = require('express');
var router = express.Router();
var fs = require('fs');

// Middleware: Checks if user is authenticated removed for more readable code


router.post('/fileupload', that.ensureAuthenticated, function(req, res, next) {
   //setup multer here 
});

 router.post('/fileupload2', that.ensureAuthenticated, function(req, res, next) {
   //setup multer here with a different destination path/filename etc
});




return router;
}

我找到了this question,但它并没有真正帮助我。

更新

我现在用 :

编辑了我的 app.js
 var multer  = require('multer');
 var imageRoutes= require('./routes/imageRoutes')(someRepo, multer);

imageRoutes.js

// POST: CREATE avatar
router.post('/avatar', function(req, res) {
    router.use(multer({
        dest: './public/img/profile/',
        rename: function (fieldname, filename) {
            return fieldname;
        },
        onFileUploadStart: function (file) {
            console.log(file.originalname + ' is starting ...')
        },
        limits: {
            files: 1
        },
        onFileUploadComplete: function (file) {
            console.log(file.fieldname + ' uploaded to  ' + file.path)
            imageUploaded=true;
            console.log(req.files);
            res.redirect('/');
        }
    }))

}); 

我看到 chrome 正在将文件上传到 100%,但它什么也没做。它没有记录正在启动..或任何其他错误。

【问题讨论】:

    标签: node.js


    【解决方案1】:

    您可以将多个中间件/路由器传递给.use()

    var multer  = require('multer');
    var parseUploads = multer({
      dest: './public/img/profile/',
      rename: function (fieldname, filename) {
        return fieldname;
      },
      onFileUploadStart: function (file) {
        console.log(file.originalname + ' is starting ...')
      },
      limits: {
        files: 1
      },
      onFileUploadComplete: function (file) {
        console.log(file.fieldname + ' uploaded to  ' + file.path)
        imageUploaded=true;
      }
    });
    
    // ...
    
    var imageRoutes  = require('./routes/imageRoutes')();
    app.use('/image', parseUploads, imageRoutes);
    

    如果您想将逻辑完全移动到 imageRoutes.js 并且您的 multer 逻辑是特定于路由的,您可以执行以下操作:

    router.post('/avatar', multer({
      dest: './public/img/profile/',
      rename: function (fieldname, filename) {
        return fieldname;
      },
      onFileUploadStart: function (file) {
        console.log(file.originalname + ' is starting ...')
      },
      limits: {
        files: 1
      },
      onFileUploadComplete: function (file) {
        console.log(file.fieldname + ' uploaded to  ' + file.path)
      }
    }), function(req, res) {
      // Here you can check `Object.keys(req.files).length`
      // or for specific fields like `req.files.imageField`
      res.redirect('/');
    });
    

    【讨论】:

    • 但如果我有例如 5 条不同的路线上传具有不同目的地的图像等,我的 app.js 将一团糟。我尝试将所有数据设置在路由文件中,而不是在 app.js 中。感谢您的帮助
    • 好的,那么只需将您的multer 用法移动到您的imageRoutes.js 文件并拥有router.use(parseUploads);router.use(multer({...}))
    • 我已经更新了我的答案,包括一个我想到的例子。如果您的multer 用法不是特定于路由的,您可以将router.use(multer({..})) 放在您的imageRoutes.js 顶部附近的某个位置(不在实际的路由处理程序内),或者您可以创建一个函数返回multer({ ... }),除了变量dest路径,如果路径之间的唯一不同就是路径。
    • 感谢您的帮助(console.log(req.files) 需要删除 req not available)。最后一个问题,我应该如何检查 imageUploaded var 目前不可用
    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多