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

10

我正在寻找如何最佳实践地自定义默认的Sails.js CRUD蓝图。我所指的简单示例是,假设我需要创建SomeModel,使用标准蓝图POST \someModel操作,并且我还想从req对象中获取有关经过身份验证的用户的信息,并将此属性设置为req.body以在beforeCreate函数中使用values.user.id

module.exports = {

  attributes: {
    // some attributes
  },

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

我对sails.js非常不熟悉,并且不想使用反模式,所以我想请教如何正确处理这种情况。如果有一些关于这个主题的好资源就更好了。


你看过重写蓝图API的文档了吗? - sgress454
当然可以。我的问题不是关于如何覆盖蓝图API,而是关于实现我的目标的最佳方法(如何正确地做到这一点)。 - dim0_0n
我可能误解了你的意思。你是说你知道实现目标的最佳方式是覆盖蓝图API,并且已经阅读了如何做到这一点的文档(即通过在控制器中创建一个“create”操作),但你想知道在该操作中放置什么代码? - sgress454
我很好奇该选择哪个选项:覆盖控制器中的“create”操作,创建一个新的自定义操作并将其添加到路由配置中,创建一个策略并将其应用于特定控制器中的“create”操作,或者可能还有其他我不知道的选项。 - dim0_0n
1个回答

5
您已经列出了几个选项,针对您的用例有一些选择。以下是对您在评论中列出的三个选项的一些想法:
  1. 覆盖controller/create—— 在这三个选项中,这是最好的选择,因为它不会因单个实例而使routespolicies中的代码混乱。
  2. 编写controller/action并添加到config/routes.js——虽然可以工作,但这违背了使用蓝图的目的,并且你必须做第一种方式中的所有代码,还要使你的routes代码更加混乱。
  3. 为单个create操作应用策略—— 要执行此操作,您不仅需要弄乱您的/policies文件夹,还需要弄乱您的policies.js文件。这是更多的代码,而且将一个控制器方法的逻辑放在两个不同的地方,其中没有一个是控制器。

在这三个选项中,选项1是最好的,因为它将代码包含在其上下文(控制器)中,并最小化编写的代码。这是假设您只想更改一个模型的create方法。


补充说明:

以下是我设置Sails应用程序的示例,其中有几个REST路由,每个路由根据调用路由的用户(具有有效的Facebook令牌)响应不同:

  1. 仅使用蓝图操作路由(而非蓝图REST路由)
  2. 首先通过策略进行:'*': ['hasFBToken', 'isTokenForMyApp', 'extractFBUser', 'extractMyAppUser'],这将在req.body中存储fbusermyappuser和其他变量
  3. 此时将调用我的控制器函数(例如controller.action()),并且可以访问有关该用户的信息,并确定它是否具有执行CRUD所需的正确权限。

此系统的优点:

  • 每个CRUD操作的所有代码都包含在其控制器函数中。
  • routes.js(无代码)或policies.js(一行代码)或/policies中最少或没有代码。
  • API版本控制很好地配合使用(例如controllers/v1.0/controller.js),使用版本化控制器比使用版本化模型更容易。这意味着,我可以创建一个新的API版本,并且仅通过在/v2.0中创建一个名为action()的控制器函数,调用如POST /v2.0/controller/action之类的内容将存在而不需要任何额外的路由设置。

希望这个例子有助于说明如何制定设计决策以提供诸如API版本控制之类的功能,并在其特定上下文中巩固代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接