在SailsJS 11.x中的蓝图路线后,回调是否有最佳做法?
我有一个Users
可以提交Idea
的API。创建Idea
后,如果它是User
的第一个Idea
,则应获得Badge
。据我所知,这个功能有两个地方。
Idea.create()
回调函数。afterCreate
模型上的Idea
操作添加lifecycle callback。我假设我在授予徽章方面所写的任何功能都应放在Service中,以便可以在不同的模型之间共享。似乎选项1不会紧密耦合,但会导致更胖的控制器。
答案 0 :(得分:2)
覆盖“创建”蓝图意味着每个模型在处理对POST /<modelName>
路由的请求时都会使用该代码,这可能不是您想要的。生命周期回调可以正常用于授予徽章,但是如果您希望根据是否授予徽章来修改响应,则此方法将无法工作 - 但您可以轻松地从生命周期发送套接字通知回调,使用User.message()。
第三个选项只是覆盖create
中的IdeaController.js
操作。它没有那么多,特别是如果你让Waterline为你处理大部分的现场验证。从本质上讲,它只是:
create: function(req, res) {
Idea.create(req.params.all()).exec(function(err, idea) {
if (err) {return res.negotiate(err);}
// ... do some stuff with the idea and send a response ...
});
}
答案 1 :(得分:1)
我会选择第二个选项,但是你应该注意afterCreate在通过桶测试和添加项目时被触发,这可能是afterCreate中逻辑的问题。 (例如:用户有3个想法,1个徽章来自第一个想法,你将它们添加到桶装置。当桶添加第一个想法它将触发afterCreate然后它将添加徽章从夹具导致用户有2重复徽章。)