在Controller中调用父操作

时间:2014-08-14 15:15:40

标签: javascript node.js sails.js

我正在尝试在我的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
    });
},

2 个答案:

答案 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&param2=value2');

或者您可以在req.session中存储您需要的内容,并在create操作中抓取它,然后清除它(我不知道这是不是很好的做法,但确实有效)。