在sails.js 中覆盖CRUD 蓝图

Posted

技术标签:

【中文标题】在sails.js 中覆盖CRUD 蓝图【英文标题】:CRUD blueprint overriding in sails.js 【发布时间】:2014-04-11 23:58:52 【问题描述】:

根据 Sails 中的这个已关闭问题: https://github.com/balderdashy/sails/issues/835

CRUD 蓝图覆盖 “当然,这是在 v0.10 中推出的”

我想修改我的sailsjs 服务中的蓝图以允许命名根(在ember 中使用)。 目前,我必须使用与蓝图中已有的大部分重复的操作来自定义我创建的每个控制器。

我怀疑我现在可以将这段代码从我的控制器中移出并移到蓝图覆盖区域,但我不清楚该代码应该放在哪里。

非常感谢您提供任何示例,甚至只是指向 .10 存储库中相关代码的指针。

【问题讨论】:

【参考方案1】:

更新

为了以下述方式覆盖 Sails 1.0 中的蓝图,您必须首先为您的项目安装“自定义蓝图”插件 (npm install sails-hook-custom-blueprints)。


要覆盖 Sails v0.10 中的蓝图,您需要创建一个 api/blueprints 文件夹并在其中添加您的蓝图文件(例如 find.jscreate.js 等)。您可以查看 Sails 蓝图挂钩中的 the code for the default actions 以获得领先优势。

还支持添加自定义蓝图,但它们目前不会自动绑定到路由。如果你创建了一个/blueprints/foo.js 文件,你可以在你的/config/routes.js 文件中绑定一个路由到它(例如):

'GET /myRoute': blueprint: 'foo'

【讨论】:

感谢您的快速回复。只是为了澄清。因为我想保留大部分当前功能,所以我将整个 find.js 从钩子代码中复制出来(并且由于依赖关系还需要 ActionUtil.js 文件)。 听起来是个好计划。 ActionUtil 文件只包含一个辅助函数来填充所有关联;如果您希望从您的蓝图中返回更纤细的对象,您可以忽略它! 这些文件不在我的节点模块/帆上。另外我如何为路线制定新的蓝图?它应该在引导程序上还是有更好的方法? 抱歉,蓝图覆盖仅是 v0.10 功能。您可以使用npm install -g sails@beta 安装最新版本,并且有一个迁移指南here。还使用有关自定义蓝图支持的信息更新了此答案。 这个答案是正确的,但是,我确实发现我需要一些额外的细节来实现。具体来说,我必须明白我的模型必须在哈希中传递,并且我还可以传递我需要对我的蓝图可用的任何其他选项,例如:'GET /myRoute': blueprint: 'foo' , 模型: 'modelNameInQuotes-lowercase', opt1: 'foo', ...【参考方案2】:

您可以在控制器中添加操作 with these names 以覆盖默认行为

改变破坏行为

module.exports = 
  destroy: function(req,res)
    Goal.update( id: req.param('id') ,  deleted: true )
    .exec(function (err, goal) 
            if (err) return res.json(err, 400);
            return res.json(goal[0]);
     );
  

【讨论】:

是否可以使用特定于控制器的逻辑来包装默认行为?在某些情况下,我想在创建时为特定资源返回状态 202 而不是 200。 是的,你可以``` return res.send(202, message:'foo ') `` 谢谢! ...嗯...我的意思是默认行为是“调用蓝图”——在我的例子中,我使用的是“sails-generate-ember-blueprints”,所以需要调用蓝图。现在我考虑了——问题是蓝图实际上调用了发送,所以我需要代理我认为的响应对象(抱怨......)。 @shaunc 你真的解决了你的问题吗?您是如何调用默认蓝图操作并修改答案的? @SwOut ...我认为这是可能的,但我不再使用帆——抱歉。【参考方案3】:

可以在蓝图中使用构建,但with policies 首先运行。这些策略可能会验证用户是否已登录、具有正确的访问权限等。真的好用!

在每个模型上,您在数据存储之前和之后都有可用的回调。挖掘:http://sailsjs.com/documentation/concepts/models-and-orm/lifecycle-callbacks

没有可用于蓝图结果的默认回调。但不要放弃。仍然可以在蓝图中使用构建,并且只修改输出。它可能不是最优雅的解决方案,但效果很好。在这里查看我的“hack”:Sails blueprints lifecycle

【讨论】:

以上是关于在sails.js 中覆盖CRUD 蓝图的主要内容,如果未能解决你的问题,请参考以下文章

Sails Js - 防止非模型字段保存在 mongo 文档中

Sails.js 政策不适用于单个控制器

如何从蓝图动态设置HTTP方法(Camel-http)

蓝图的父子关系

Flask---蓝图

UE4蓝图传递