如何在SailsJS REST蓝图之后运行回调函数?

时间:2015-08-12 18:01:15

标签: javascript rest sails.js

在SailsJS 11.x中的蓝图路线后,回调是否有最佳做法?

我有一个Users可以提交Idea的API。创建Idea后,如果它是User的第一个Idea,则应获得Badge。据我所知,这个功能有两个地方。

  1. Copy/Override the Sails rest blueprint,将功能添加到Idea.create()回调函数。
  2. afterCreate模型上的Idea操作添加lifecycle callback
  3. 我假设我在授予徽章方面所写的任何功能都应放在Service中,以便可以在不同的模型之间共享。似乎选项1不会紧密耦合,但会导致更胖的控制器。

2 个答案:

答案 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重复徽章。)