当前位置: 首页 > 知识库问答 >
问题:

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

伯茂才
2023-03-14

我得到了图像上传工作在我的项目,但我想组织和整理它一点。

理想情况下,我希望我的图像上传在一个函数或控制器内完成。我以前让multer在我的路由文件中完成图像上传。像这样:

null

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);

这类作品。这个问题是,我需要设置一些限制什么可以上传,也显示错误消息回模板。如果我把它从routes文件中分离出来,这将会更整洁。

为什么这不起作用?

我正在一个名为“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没有用表单数据修改请求对象吗?这不是意味着我可以在使用next()之后将它转发给我的另一个控制器吗。然后,我希望blog_controller.blog_create_post对请求html" target="_blank">执行所需的其他所有操作。

谢谢,希望你能帮忙。

共有1个答案

段干河
2023-03-14

调用 不执行任何操作。这相当于做:

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();

}

记住 只是中间件。 的确切逻辑如下所示。

因此,如果我正确理解

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 is a node.js middleware for handling multipart/form-data, which is primarily used for uploading files. It is written on top of busboy for maximum efficiency. NOTE: Multer will not process any f

  • 本文向大家介绍Jmeter逻辑控制器事务控制器使用方法解析,包括了Jmeter逻辑控制器事务控制器使用方法解析的使用技巧和注意事项,需要的朋友参考一下 一、基本概念: Transaction controller:一般是指要做的或所做的事情,在关系数据库一个事务可以是一条SQL语句,一组SQL语句或整个程序、在实际的工作过程中,将完成一个业务的一系列操作称作为事务,我们来举最为典型的用户登录场景为

  • 当存在多个时,视图解析器如何确定要加载哪个控制器。 我正在从头开始学习Spring,正如我的导师所说,我们只需要一个带有注释的控制器类。如果我有多个带有注释的类,以及如何确定要加载哪个控制器类,因为Spring是Singleton,并且只有一个控制器类存在。

  • 问题内容: 我编写角度控制器的风格是这样的(使用控制器名称而不是函数) 我现在需要的是提供我要定义解析部分的路线时: 由于控制器定义为名称,如何解决以下问题? 为了更详细地阐明,我想在解析路由之前从服务器加载一些数据,然后在控制器中使用这些数据。 更新: 更准确地说,我希望每个模块都有其“解析”功能,该功能将在执行具有该控制器的root用户之前被调用。这篇文章中的解决方案(由MiskoHevery

  • 我有一个后api,有对象,但我不能打印在控制台上它的下载未定义我以为我错过了身体解析器,但添加身体解析器后,我看到错误身体解析器弃用身体解析器:使用个人json/urlencoded middlewares将不胜感激。 路线。js 应用程序。js

  • 为什么find不是函数? 这是模型: