我正在寻找自定义默认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很新,并且不想使用反模式,所以我要求输入处理此类案件的正确方法。在这个主题上有一些很好的资源也很棒。
答案 0 :(得分:3)
您可以通过以下方式确定一些选项,并且通常情况下,这取决于您的使用案例。以下是您在评论中列出的三个选项的一些想法:
controller/create
- 在这三个中,这是最佳选择,因为它不会阻塞单个实例的routes
或policies
中的代码。controller/action
并添加到config/routes.js
- 虽然这样做有效但却无法使用蓝图,您必须执行选项1中的所有代码并制作routes
代码混乱。 create
操作应用策略 - 为此,您不仅要弄乱/policies
文件夹,还要弄乱policies.js
文件。这是更多的代码并且它将一个控制器方法的逻辑放在两个不同的位置,这两个位置都不是控制器。在这三个中,选项1是最好的,因为它包含其上下文(控制器)的代码并最小化编写的代码。这假设您只想更改一个模型的create
方法。
旁注:
作为您的用例如何确定您的实现的示例,以下是我如何设置我的Sails应用程序,其中有几条REST路由,每条路由根据呼叫路由的用户做出不同的响应(使用有效的Facebook令牌):
'*': ['hasFBToken', 'isTokenForMyApp', 'extractFBUser', 'extractMyAppUser']
fbuser
,myappuser
和其他变量的req.body
controller.action()
)被调用,可以访问有关该用户的信息,并确定它是否具有执行CRUD的正确权限。该系统的优点:
routes.js
(无代码)或policies.js
(一行)或/policies
controllers/v1.0/controller.js
),这对版本化控制器比版本化模型更容易。这意味着我可以创建一个新的API版本,只需在/v2.0
中使用函数action()
创建一个控制器,就会存在POST /v2.0/controller/action
之类的调用而不需要额外的路由。希望此示例有助于说明如何制定设计决策以提供API版本控制等功能,并在特定上下文中整合代码。