【问题标题】:How do I run a callback function after a SailsJS REST Blueprint?如何在 SailsJS REST 蓝图之后运行回调函数?
【发布时间】:2015-08-12 18:01:15
【问题描述】:

在 SailsJS 11.x 中的蓝图路由之后有回调的最佳实践吗?

我有一个 API,Users 可以提交 Ideas。在创建Idea 之后,如果它是User 的第一个Idea,他们应该得到一个Badge。据我所知,有两个地方可以放置此功能。

  1. Copy/Override the Sails rest blueprint,将功能添加到Idea.create() 回调函数中。
  2. Idea 模型上的afterCreate 操作添加lifecycle callback

我假设我在授予徽章方面编写的任何功能都应该放在Service 中,以便可以在不同模型之间共享。似乎选项 1 不会那么紧密耦合,但会导致控制器更胖。

【问题讨论】:

  • 我会选择第一个选项,因为它更灵活。我不介意控制器有点胖;)。

标签: javascript rest sails.js


【解决方案1】:

覆盖“创建”蓝图意味着每个模型在处理对其POST /<modelName> 路由的请求时都将使用该代码,这可能不是您想要的。生命周期回调可以很好地授予徽章,但是如果您希望根据是否授予徽章来修改响应,这种方法将不起作用——但您可以轻松地从生命周期发送套接字通知回调,使用User.message()

第三个选项只是覆盖IdeaController.js 中的create 操作。没有那么多,特别是如果您让 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 和 3 的组合是我正在寻找的。我可以使用蓝图创建操作作为基础来扩展功能,同时保留所有的好东西。
【解决方案2】:

我会选择第二个选项,但是您应该注意,在通过桶测试和添加项目时会触发 afterCreate,这可能是 afterCreate 中的逻辑问题。 (例如:用户有 3 个想法,第一个想法中有 1 个徽章,您将它们添加到桶装置中。当桶添加第一个想法时,它将触发 afterCreate,然后它将添加夹具中的徽章,导致用户拥有 2重复的徽章。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2012-07-31
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多