在sails.js中更改默认蓝图操作的最佳实践

时间:2016-02-21 19:08:33

标签: javascript node.js sails.js

我正在寻找自定义默认sails.js CRUD蓝图的最佳做法的答案。我的意思的简单示例是让我说我​​需要使用标准蓝图SomeModel操作创建POST \someModel,并且我还希望从req获取有关经过身份验证的用户的信息对象并将此属性设置为req.body以在values.user.id函数中使用beforeCreate

module.exports = {

  attributes: {
    // some attributes
  },

  beforeCreate: function (values, cb) {
    // do something with values.user.id
  }
};

我对sails.js很新,并且不想使用反模式,所以我要求输入处理此类案件的正确方法。在这个主题上有一些很好的资源也很棒。

1 个答案:

答案 0 :(得分:3)

您可以通过以下方式确定一些选项,并且通常情况下,这取决于您的使用案例。以下是您在评论中列出的三个选项的一些想法:

  1. 覆盖controller/create - 在这三个中,这是最佳选择,因为它不会阻塞单个实例的routespolicies中的代码。
  2. 撰写controller/action并添加到config/routes.js - 虽然这样做有效但却无法使用蓝图,您必须执行选项1中的所有代码并制作routes代码混乱。
  3. 为单个create操作应用策略 - 为此,您不仅要弄乱/policies文件夹,还要弄乱policies.js文件。这是更多的代码并且它将一个控制器方法的逻辑放在两个不同的位置,这两个位置都不是控制器。
  4. 在这三个中,选项1是最好的,因为它包含其上下文(控制器)的代码并最小化编写的代码。这假设您只想更改一个模型的create方法。

    旁注:

    作为您的用例如何确定您的实现的示例,以下是我如何设置我的Sails应用程序,其中有几条REST路由,每条路由根据呼叫路由的用户做出不同的响应(使用有效的Facebook令牌):

    1. 仅使用蓝图行动路线(不是蓝图REST路线)
    2. 首先通过政策: 在'*': ['hasFBToken', 'isTokenForMyApp', 'extractFBUser', 'extractMyAppUser']
    3. 中存储fbusermyappuser和其他变量的req.body
    4. 此时,我的控制器功能(例如controller.action())被调用,可以访问有关该用户的信息,并确定它是否具有执行CRUD的正确权限。
    5. 该系统的优点:

      • 每个CRUD操作的所有代码都包含在其控制器函数
      • routes.js(无代码)或policies.js(一行)或/policies
      • 中的最小到无代码
      • 适用于API Versioning(例如controllers/v1.0/controller.js),这对版本化控制器比版本化模型更容易。这意味着我可以创建一个新的API版本,只需在/v2.0中使用函数action()创建一个控制器,就会存在POST /v2.0/controller/action之类的调用而不需要额外的路由。

      希望此示例有助于说明如何制定设计决策以提供API版本控制等功能,并在特定上下文中整合代码。