所以我试图用nodejs建立一个应用程序,使用快递和护照,但是当我尝试做某种TDD时,我想要将商务逻辑与控制器分离。
所以我有一个像这样的常见场景:
经过身份验证的用户想要删除项目,他向api发送请求:
DELETE /api/item/1
请求由控制器方法处理,该方法将发出请求的用户传递给下一层(看起来不是一个好的方法):
exports.delete = function (req, res, next) {
var itemId = req.params.id;
var userId = req.user._id;
itemService.delete(itemId, userId, function (err, item) {
if (err) next(err);
return res.json(item);
});
};
服务层(或任何您想要调用它的层,具有所有业务逻辑的层)然后检查该项是否归该用户所有,然后删除它或者否则返回错误。
所以我想知道是否有任何方法可以从任何层获取当前用户而不从控制器传递它。
答案 0 :(得分:1)
在路由配置中,您应确保用户拥有该项目,然后再将其传递给控制器:
app.del('/api/item/1', ensureUserOwnsItem, itemController.delete);
这将导致在调用控制器之前调用函数ensureUserOwnsItem
。
它应该是这样的:
function ensureUserOwnsItem(req, res, next) {
if (/* user owns item */) {
next();
} else {
res.send(401, 'You can\'t delete an item you don\'t own');
}
}
您可以在POST
路线上重复使用它:
app.post('/api/item/1', ensureUserOwnsItem, itemController.post);
我建议您将此功能放在AuthController
或类似的内容中。