我正在尝试在我的Sails.js应用程序的特定控制器中覆盖update()和create()动作。
我要做的是首先上传文件,然后在请求正文中存储文件路径(使用skipper存储在s3上),然后调用蓝图“create()”或“update()” “恢复正常工作流程的行动。
我看到不建议在这些情况下使用next(),所以我想知道在这里使用的最佳方法是什么。
update: function(req, res) {
var options = {
adapter: require('skipper-s3'),
key: sails.config.s3.accessKeyId,
secret: sails.config.s3.secretAccessKey,
bucket: sails.config.s3.bucket,
region: sails.config.s3.region
};
req.file('image').upload(options, function(err, files) {
if (err) res.error(err);
_.each(files, function(file){
req.body['logo'] = file.extra.Location;
});
// CALL PARENT HERE
});
},
答案 0 :(得分:1)
Sails没有为您提供从控制器内调用默认蓝图操作代码的方法。但是,您可以轻松地覆盖蓝图代码。只需将您自己的 update.js 文件放在 api / blueprints.js 文件夹中(您可能需要创建该文件夹),使用core update.js source code作为开始点。
当然,这将覆盖所有模型的蓝图。如果您只想为单个模型覆盖它,则必须在控制器内部执行此操作,如示例所示。在这种情况下,使用next()
实际上没有任何问题,除了在这种情况下,它不会起作用。默认蓝图路由未绑定到已存在同名自定义操作的URL。如果您致电next()
,您将获得404。
如果要覆盖某些的蓝图,而不是所有模型,则将共享代码放在service中,并从个人{{1}调用服务代码每个控制器中的动作。
答案 1 :(得分:0)
您可以通过以下方式结束update
控制器操作:
res.redirect('/yourControllerName/create');
如果要传递任何参数,可以直接传递:
res.redirect('/yourControllerName/create?param1=value1¶m2=value2');
或者您可以在req.session
中存储您需要的内容,并在create
操作中抓取它,然后清除它(我不知道这是不是很好的做法,但确实有效)。