蓝图操作(不要与隐式蓝图“操作”路由混淆)是旨在与您的模型一起使用的通用操作。可以将它们视为应用程序的默认行为。例如,如果您有一个User.js
模型,那么find
、create
、update
、destroy
、populate
、add
和remove
操作隐式存在,无需您编写它们。
默认情况下,蓝图RESTful 路由和快捷路由绑定到其对应的蓝图操作。但是,可以通过在该控制器文件中创建自定义操作(例如ParrotController.find
)来覆盖特定控制器的任何蓝图操作。
当前版本的 Sails 附带以下蓝图操作
大多数蓝图操作都具有实时功能,如果您的应用程序启用了 WebSockets,则这些功能会生效。例如,如果**find**蓝图操作从套接字客户端接收请求,它将订阅该套接字以获取未来的通知。然后,任何时候使用像**update**这样的蓝图操作更改记录时,Sails 都会发布某些通知。
了解特定蓝图操作行为的最佳方法是阅读其参考页面(或查看上面的列表)。但是,如果您正在寻找关于 Sails 的蓝图 API 中实时功能如何工作的更宏观的视角,请参阅概念 > 实时。(如果您不介意一些细节过时,您甚至可能想查看2013 年的原始“Sails.js 入门”视频。)
有关 Sails 中蓝图操作发布的所有通知的更高级的细分,请参阅
您还可以通过定义具有相同名称的自定义操作来覆盖控制器的任何蓝图操作。
// api/controllers/user/UserController.js
module.exports = {
/**
* A custom action that overrides the built-in "findOne" blueprint action.
* As a dummy example of customization, imagine we were working on something in our app
* that demanded we tweak the format of the response data, and that we only populate two
* associations: "company" and "friends".
*/
findOne: function (req, res) {
sails.log.debug('Running custom `findOne` action. (Will look up user #'+req.param(\'id\')...');
User.findOne({ id: req.param('id') }).omit(['password'])
.populate('company', { select: ['profileImageUrl'] })
.populate('top8', { omit: ['password'] })
.exec(function(err, userRecord) {
if (err) {
switch (err.name) {
case 'UsageError': return res.badRequest(err);
default: return res.serverError(err);
}
}
if (!userRecord) { return res.notFound(); }
if (req.isSocket) {
User.subscribe(req, [user.id]);
}
return res.ok({
model: 'user',
luckyCoolNumber: Math.ceil(10*Math.random()),
record: userRecord
});
});
}
}
或者,我们可以将其创建为
api/controllers/user/findone.js
中的独立操作,或者使用actions2。