在sails.js中更改默认蓝图操作的最佳实践
我正在寻找一个最佳做法来自定义默认的sails.js CRUD蓝图的答案。 我的意思是一个简单的例子,假设我需要使用标准蓝图POST \someModel
动作来创buildSomeModel
,并且我想从req
对象中获取有关已authentication用户的信息,并将此属性设置为req.body
以使用values.user.id
在beforeCreate
函数中:
module.exports = { attributes: { // some attributes }, beforeCreate: function (values, cb) { // do something with values.user.id } };
我对sails.js非常陌生,不想使用反模式,所以我要求提供什么是处理这种情况的正确方法的input。 在这个话题上也有一些很好的资源是很好的。
有几个选项可供您识别,像往常一样,这取决于您的使用情况。 以下是您在评论中列出的三个选项的一些想法:
- 覆盖
controller/create
– 这三者中,这是最好的select,因为它不会阻塞单个实例的routes
或policies
中的代码。 - 写
controller/action
并添加到config/routes.js
– 虽然这个工程,它挫败了使用蓝图的目的,你必须做选项1中的所有代码,加上你的routes
代码更混乱。 - 为单个
create
操作应用策略 – 要做到这一点,您不仅必须凌乱您的/policies
文件夹,还要整理您的policies.js
文件。 这是更多的代码,它把一个控制器方法的逻辑放在两个不同的地方,这两个地方都不是控制器。
在这三个选项中,选项1是最好的,因为它包含上下文(控制器)的代码并最小化书面代码。 这是假设你只想改变一个模型的create
方法。
边注:
作为你的用例如何确定你的实现的一个例子,下面是我如何设置我的Sails应用程序,它有几个REST路由,每个基于用户调用路由(用一个有效的Facebook标记)响应不同。
- 只使用蓝图动作路线(不是蓝图REST路线)
- 首先通过以下策略:
'*': ['hasFBToken', 'isTokenForMyApp', 'extractFBUser', 'extractMyAppUser']
将fbuser
中存储fbuser
,myappuser
和其他variables - 在这一点上,我的控制器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,并在特定的上下文中整合代码。