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

我正在寻找一个最佳做法来自定义默认的sails.js CRUD蓝图的答案。 我的意思是一个简单的例子,假设我需要使用标准蓝图POST \someModel动作来创buildSomeModel ,并且我想从req对象中获取有关已authentication用户的信息,并将此属性设置为req.body以使用values.user.idbeforeCreate函数中:

 module.exports = { attributes: { // some attributes }, beforeCreate: function (values, cb) { // do something with values.user.id } }; 

我对sails.js非常陌生,不想使用反模式,所以我要求提供什么是处理这种情况的正确方法的input。 在这个话题上也有一些很好的资源是很好的。

有几个选项可供您识别,像往常一样,这取决于您的使用情况。 以下是您在评论中列出的三个选项的一些想法:

  1. 覆盖controller/create – 这三者中,这是最好的select,因为它不会阻塞单个实例的routespolicies中的代码。
  2. controller/action并添加到config/routes.js – 虽然这个工程,它挫败了使用蓝图的目的,你必须做选项1中的所有代码,加上你的routes代码更混乱。
  3. 为单个create操作应用策略 – 要做到这一点,您不仅必须凌乱您的/policies文件夹,还要整理您的policies.js文件。 这是更多的代码,它把一个控制器方法的逻辑放在两个不同的地方,这两个地方都不是控制器。

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


边注:

作为你的用例如何确定你的实现的一个例子,下面是我如何设置我的Sails应用程序,它有几个REST路由,每个基于用户调用路由(用一个有效的Facebook标记)响应不同。

  1. 只使用蓝图动作路线(不是蓝图REST路线)
  2. 首先通过以下策略: '*': ['hasFBToken', 'isTokenForMyApp', 'extractFBUser', 'extractMyAppUser']fbuser中存储fbusermyappuser和其他variables
  3. 在这一点上,我的控制器function(如controller.action() )被调用,并可以访问有关该用户的信息,并确定它是否有正确的权限来做CRUD。

这个系统的优点:

  • 每个CRUD操作的所有代码都包含在其控制器function中
  • routes.js (无代码)或policies.js (一行)或/policies最less到没有代码
  • 与API版本控制 (例如controllers/v1.0/controller.js )一起使用,版本控制器比版本化模型要容易得多。 这意味着我可以创build一个新的API版本,只需在/v2.0中用一个函数action()创build一个控制器, POST /v2.0/controller/action等调用将不需要额外的路由。

希望这个例子有助于说明如何做出devise决策来提供API版本等function,并在特定的上下文中整合代码。