【问题标题】:Parse request with Express and Multer within controller在控制器中使用 Express 和 Multer 解析请求
【发布时间】:2018-08-10 21:40:28
【问题描述】:

我已经在我的项目中上传图片,但是我想整理一下。

理想情况下,我希望我的图像上传在函数或控制器中完成。我之前已经让 multer 在我的路线文件中完成了图像上传。像这样:

route.js:

var upload = multer({
    storage: multer.diskStorage({
        destination: function(req, file, cb) {
            cb(null, 'public/cms/images/uploads')
        },
        filename: function(req, file, cb) {
            cb(null, randomString.generate({length: 7, charset: 'alphanumeric'}) + path.extname(file.originalname))
        }
    })
})

router.post('/fileupload', login_controller.requires_login, upload.single('imagefile'), test_controller.file_upload_post);

这种作品。问题在于,我需要对可以上传的内容设置一些限制,并在模板上显示错误消息。如果我把它从我的路由文件中分离出来,这会更整洁。

为什么这不起作用?

我正在一个名为“upload_image”的控制器中创建一个函数并在路由中调用它。

route.js:

router.post('/blogpost/create', blog_controller.upload_image, blog_controller.blog_create_post);

blogController.js:

exports.upload_image = function (req, res, next) {

    var upload = multer({
        storage: multer.diskStorage({
            destination: function (req, file, cb) {
                cb(null, 'public/cms/images/uploads')
            },
            filename: function (req, file, cb) {
                cb(null, randomString.generate({ length: 7, charset:  'alphanumeric' }) + path.extname(file.originalname))
            }
        })
    })

    upload.single('imagefile');

    return next();

}

当我这样做时,req.body 和 req.file 是未定义的。没有图像被上传。除了我使用 req.body 或 req.file 的任何地方之外,没有错误消息并且模板呈现良好。

multer不会用表单数据修改req对象吗?这是否意味着我可以在使用 next() 后将其转发给我的另一个控制器。我想要 blog_controller.blog_create_post 然后根据请求执行我需要的所有其他操作。

谢谢,希望能帮到你。

【问题讨论】:

    标签: node.js express model-view-controller multer


    【解决方案1】:

    调用upload.single('imagefile') 什么都不做。相当于做:

    exports.upload_image = function (req, res, next) {
        var upload = multer({
            storage: multer.diskStorage({
                destination: function (req, file, cb) {
                    cb(null, 'public/cms/images/uploads')
                },
                filename: function (req, file, cb) {
                    cb(null, randomString.generate({ length: 7, charset:  'alphanumeric' }) + path.extname(file.originalname))
                }
            })
        })
    
        function (req, res, next) {}
    
        return next();
    
    }
    

    记住multer 只是中间件。 multer 采用的确切逻辑显示在 here

    所以如果我正确理解了multer 的来源,这样的事情可能会起作用:

    exports.upload_image = function (req, res, next) {
        var upload = multer({
            storage: multer.diskStorage({
                destination: function (req, file, cb) {
                    cb(null, 'public/cms/images/uploads')
                },
                filename: function (req, file, cb) {
                    cb(null, randomString.generate({ length: 7, charset:  'alphanumeric' }) + path.extname(file.originalname))
                }
            })
        })
    
        returnupload.single('imagefile')(req, res, next)
    
        return next();
    
    }
    

    我没有测试过,但是类似的。

    【讨论】:

    • 这解释了 multer 的工作原理,我可以使用这些信息进行更改。谢谢。
    • 我不确定函数后面的 (req, res, next) 是什么。它是什么东西的短手吗?我没有在这样的函数之后使用参数。 return upload.single('imagefile')(req, res, next);
    • multer 返回中间件,这就是为什么您通常将其用作app.post('/', upload.single('file'), ...) 参见using Express middleware
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2015-04-15
    • 1970-01-01
    • 2015-08-22
    • 2016-10-14
    相关资源
    最近更新 更多