SailsJs控制器上下文

SailsJs controller context

本文关键字:上下文 控制器 SailsJs      更新时间:2023-09-26

有人知道将上下文传递给控制器动作的正确方法吗?以下是我想这么做的原因:

---AbstractPageController.js--

module.exports = {
    _getPageData: function(req, res) {
        return {
            data: {
                title: this._getTitle(req, res), // if do nothing "this" is global object
                menu: this._getMenu(req, res)
            }
        };
    },
    _getTitle: function(req, res) { return 'Cool Page'; },
    _getMenu: function(req, res) { return [{ href: '/logout' }]; }
};

---ConcretePageController.js——

var _ = require('lodash');
    _super = require('./AbstractPageController.js');
module.exports = _.merge({}, _super, {
    'main': function(req, res) {
        res.view('pageTemplate', this._getPageData(req, res));
    },
    _getTitle: function(req, res) {
        return 'Absolutely - ' + _super._getTitle(req, res);
    },
    _getMenu: function(req, res) {
        return [{ href: '/main/'}].concat(_super._getMenu(req, res));
    }
});

这就是为什么我需要背景。

对于这个特殊的情况,我找到了这个解决方案:

---routes.js---

var concreteController = require('../api/controllers/ConcretePageController.js');
module.exports.routes = {
    '/concrete_page': function(req, res) { concreteController.main(req, res); }
}

但它看起来有点丑陋,帆钩(例如政策)停止了工作。

我在想另一种方式。这样做的主要目的是将所有逻辑转移到服务,并使用简单的继承。但这对我来说似乎也很奇怪

有什么更好的方法来处理我写的案件的想法吗?

附言:我上面写的所有代码都只是一个例子。

我认为您需要预先设置一些数据以发送到视图模板,对吗?

是的,你可以使用前钩(如midleware)或帆警

我使用帆钩来预加载我们插件中npm模块的帆功能https://github.com/wejs/we-plugin

检查此挂钩,了解如何在控制器之后的所有请求中加载用户区域设置:链接:https://github.com/wejs/we-example/blob/master/api/hooks/we-locale/index.js#L15

您应该直接引用控制器

sails.controllers.yourControllerName.getTitle()

https://stackoverflow.com/a/20994036/1821723