【发布时间】:2015-03-28 01:27:48
【问题描述】:
SailsJS 提供默认的蓝图操作,例如查找、更新、创建等。
我需要覆盖其中的一些以适应特定的业务目的。但是,我想添加它们,而不是简单地覆盖它们。如何在覆盖操作中调用默认蓝图操作。
例如update可以更新模型的记录。
update
除了更新模型的记录之外,我还想让 update 做更多的事情。在我的自定义更新方法中,我不想重复默认更新。我该怎么做?
【问题讨论】:
标签: sails.js
SailsJS 提供默认的蓝图操作,例如查找、更新、创建等。
我需要覆盖其中的一些以适应特定的业务目的。但是,我想添加它们,而不是简单地覆盖它们。如何在覆盖操作中调用默认蓝图操作。
例如update可以更新模型的记录。
update
除了更新模型的记录之外,我还想让 update 做更多的事情。在我的自定义更新方法中,我不想重复默认更新。我该怎么做?
【问题讨论】:
标签: sails.js
您应该查看sailsjs 中的lifecycle callbacks。因此,例如,您可以使用beforeUpdate 或beforeCreate 生命周期回调在模型中做更多事情:
var bcrypt = require('bcrypt');
module.exports = {
attributes: {
username: {
type: 'string',
required: true
},
password: {
type: 'string',
minLength: 6,
required: true,
columnName: 'encrypted_password'
}
},
// Lifecycle Callbacks
beforeCreate: function (values, cb) {
// Encrypt password
bcrypt.hash(values.password, 10, function(err, hash) {
if(err) return cb(err);
values.password = hash;
//calling cb() with an argument returns an error. Useful for canceling the entire operation if some criteria fails.
cb();
});
}
};
【讨论】:
beforeCreate 回调吗?也许您正在那里编辑和保存模型而不使用触发beforeUpdate的回调?
复制所有内容
PROJECT-ROOT\node_modules\sails\lib\hooks\blueprints\actions
到
PROJECT-ROOT\config\blueprints
确保 findOne.js 是小写的。您需要修改每一项以引用actionUtil.js 的位置。您现在可以随心所欲地修改这些内容,而无需重新发明轮子。
【讨论】:
A hook ('userconfig') failed to load!。
我刚刚遇到了同样的问题,并找到了一种不同的方法来解决它。如果将来有人遇到同样的问题,它可能会有所帮助。我最后做的是在控制器中重新编写动作,在我的例子中是add,然后在里面做了一些事情之后,调用了默认蓝图的动作。
所以,我的代码如下所示:
add: function (req, res) {
if (xxx) {
// I need to do something only when the condition above is met
Section.count({xxx: xxx)}).exec(function (error, count) {
if (error) {
return res.json(500, {error: 'There was an error while trying to run query'});
}
//I do what I have to do
return sails.hooks.blueprints.middleware.add(req, res);
});
} else {
//I just return the default blueprint's action
return sails.hooks.blueprints.middleware.add(req, res);
}
}
因此,基本上,默认蓝图函数存储在:
sails.hooks.blueprints.middleware
【讨论】:
sails.hooks.blueprints.middleware中的所有函数都有小写名称(例如findone)
sails.hooks.blueprints.middleware.findone(req, res); 我怎样才能得到模型对象之前被发送回客户端?
sails.hooks.blueprints.middleware 似乎没有这些(find、findone、findOne 等)。知道他们被转移到哪里了吗?解决方法是require(`${sails.config.appPath}/node_modules/sails/lib/hooks/blueprints/${action}`),但一点也不理想...