Express 将中间件功能添加到异步导出

Express 将中间件功能添加到异步导出,express,mongoose,multer,Express,Mongoose,Multer,我已将我的路线与其定义分开,因此我的路线如下所示: router.post('/register', upload, handle.register); const router=require('express').router(); const handle=require('../handlers'); router.post('/register',handle.register); //处理程序定义路由。这样地: exports.register=async(请求、恢复、下一步)=>

我已将我的路线与其定义分开,因此我的路线如下所示:

router.post('/register', upload, handle.register);
const router=require('express').router();
const handle=require('../handlers');
router.post('/register',handle.register);
//处理程序定义路由。这样地:
exports.register=async(请求、恢复、下一步)=>{
试一试{
const user=wait db.user.create(请求主体);
const{id,username}=user;
res.status(201).json({id,username});
}捕捉(错误){
如果(错误代码===11000){
err.message='抱歉,已获取详细信息';
}
下一个(错误);
}
};
这个很好用。现在我需要在用户注册时上传图像(使用multer中间件)。许多示例显示multer是这样使用的:

router.post('/register', upload, handle.register);
router.post('/register',upload,function(req,res,next){//upload是multer中间件
console.log(请求文件);
})

如何在我的案例中添加中间件?

您可以这样添加中间件:

router.post('/register', upload, handle.register);
就像你看到的例子一样

在我看来,不是那么卑微 您提到您已将路由与路由处理程序分离。在我看来,这不仅是误导,而且是完全错误的

在其他语言中常见的MVC体系结构中,路由和路由处理程序一起构成控制器。在您的设计中,您已将控制器拆分为两个独立的结构。主要是,这使得路由处理逻辑和路由信息存在于两个单独的文件中,而它们应该彼此非常接近

现在,您正在添加中间件,您会发现Middleaware安装在routes中,根据您的设计,很难确定为路由处理程序安装了什么中间件

将业务逻辑与路由分离的正确方法是遵循MVC设计模式-将模型与控制器分离(视图是免费的,因为它基本上是
res.json()

在我看来,你应该为你的用户创建一个模型,而不是把控制器分成两部分。您的用户显然需要注册功能,注册功能应该成功或失败,但不应该关心任何HTTP错误处理,因为这是控制器的工作:

exports.user = {
    // .. other methods

    register: async function (username, password) {
      try {
        const user = await db.User.create({username, password});
        return user;
      } catch (err) {
        if(err.code === 11000){
            err.message ='Sorry, details already taken';
        }
        throw err;
      }
    }
}
然后在控制器中(最简单的示例称为“路线”)执行以下操作:

不过,这只是我个人的看法