模块化 Multer 功能问题

Modularizing Multer Functionality Issue

我正在尝试通过模块化我的 multer 模块功能来清理我的控制器,这允许我使用我的表单上传多个文件。下面显示的当前代码有效,但我想将 multer 函数放在一个新文件中。我假设简单地获取函数并将其从另一个文件导出就可以了,但是由于某种原因我在表单 POST 期间超时,尽管在 console.log 的开头调用了 multer代码。似乎该代码中的某些内容正在停止该过程,但没有抛出错误消息。有没有人看到可能导致错误的原因?

Mu​​lter 在路由文件中调用:

var aws = require('aws-sdk');
var multer = require('multer');
var multerS3 = require('multer-s3');
var moment = require('moment');

var uploadDate = new moment().format("YYYY-MM-DD");
var s3 = new aws.S3();
var options = {
    Bucket: process.env.AWS_BUCKET,
    Expires: 60
};

if(app.get('env') === 'production' || app.get('env') === 'staging'){
    options.ACL = 'private'
} else {
    options.ACL = 'public-read'
};

//////////Multer code being called

var upload = multer({
    storage: multerS3({
        s3: s3,
        bucket: options.Bucket,
        contentType: multerS3.AUTO_CONTENT_TYPE,
        acl: options.ACL,
        key: function(req, file, cb){
            var fileNameFormatted = file.originalname.replace(/\s+/g, '-').toLowerCase();
            cb(null, req.session.organizationId + '/' + uploadDate + '/' + fileNameFormatted);
        }
    }),
    fileFilter: function(req, file, cb){
        if(!file.originalname.match(/\.(jpg|jpeg|png|gif|csv|xls|xlsb|xlsm|xlsx)$/)){
            return cb('One of your selected files is not supported', false);
        }
        cb(null, true);
    }
}).array('fileUpload', 5);

///////Post route calling multer and rest of form submission

.post(function(req, res){

     upload(req, res, function(){
        if(err){
            console.log('Multer upload error');
            req.flash('error', err);
            res.redirect(req.get('referer'));
            return;
        }

        ... MORE CODE ...
    })
});

/controllers/multer.js,其中包含multer代码:

var express = require('express');
var app = express();
var aws = require('aws-sdk');
var multer = require('multer');
var multerS3 = require('multer-s3');
var moment = require('moment');

var s3 = new aws.S3();
var uploadDate = new moment().format("YYYY-MM-DD");

var options = {
    Bucket: process.env.AWS_BUCKET,
    Expires: 60,
    //ContentType: req.query.file_type
};

if(app.get('env') === 'production' || app.get('env') === 'staging'){
    options.ACL = 'private'
} else {
    options.ACL = 'public-read'
};

module.exports = {

    //Annotation file upload
    annotationFileUpload: function(){
        multer({
            storage: multerS3({
                s3: s3,
                bucket: options.Bucket,
                contentType: multerS3.AUTO_CONTENT_TYPE,
                acl: options.ACL,
                key: function(req, file, cb){
                    console.log("key called");
                    var fileNameFormatted = file.originalname.replace(/\s+/g, '-').toLowerCase();
                    cb(null, req.session.organizationId + '/' + uploadDate + '/' + fileNameFormatted);
                }
            }),
            fileFilter: function(req, file, cb){
                console.log("file filter called");
                if(!file.originalname.match(/\.(jpg|jpeg|png|gif|csv|xls|xlsb|xlsm|xlsx)$/)){
                    return cb('One of your selected files is not supported', false);
                }
                cb(null, true);
            }
        }).array('fileUpload', 5);
    }
}

正在导入/controller/multer并调用路由:

var multerFile = require('./components/multer');

    .post(function(req, res){

    multerFile.annotationFileUpload(req, res, function(err){
                if(err){
                    console.log('Multer upload error');
                    req.flash('error', err);
                    res.redirect(req.get('referer'));
                    return;
                }
           ....MORE CODE....
         })
    });

您需要摆脱包装函数,因为 multer() returns 中间件函数本身。它超时的原因是因为你正在调用一个函数,它只创建中间件并立即丢弃它,然后什么都不做(比如响应请求)。

所以改变这个:

annotationFileUpload: function(){
    multer({
       // ...
    }).array('fileUpload', 5);
}

对此:

annotationFileUpload: multer({
  // ...
}).array('fileUpload', 5)