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;
}
}
}
然后在控制器中(最简单的示例称为“路线”)执行以下操作:
不过,这只是我个人的看法