在控制器内使用Express和Multer解析请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在控制器内使用Express和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的任何地方之外,没有错误消息和模板呈现正常。

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

谢谢,希望你能帮忙。

答案

打电话给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();

}

我还没有测试过,但有类似的东西。

以上是关于在控制器内使用Express和Multer解析请求的主要内容,如果未能解决你的问题,请参考以下文章

express文件上传中间件Multer详解

如何使用 javascript fetch api 和 express multer 上传图像

multer详解

如何在 Cloud Functions for Firebase(multer、busboy)上使用 express 执行 HTTP 文件上传

使用 multer 和 express 上传图片

multer处理post请求的代码演示