【问题标题】:In sails.js, how to access session variables outside controller?在sails.js 中,如何访问控制器外部的会话变量?
【发布时间】:2014-04-03 09:37:31
【问题描述】:

在控制器中,这很容易。访问会话变量很简单:

req.session.x = 1

但是,我如何访问该外部控制器?喜欢服役吗?

module.exports.test = function() {
    // No req.session here?
};

【问题讨论】:

  • 只需将 req.session 作为参数传递给服务的方法

标签: node.js sails.js


【解决方案1】:

您可以创建一个主控制器,它将在您的所有服务中为每个调用的路由控制器注册reqres

这是我的主控制器的代码:

module.exports = function MainController() {

  var _this = this;

  function _execRouteMethod(req, res) {
    // Add here your services or whatever with a registration
    // of req and/or res variables
    ActiveUserService.registerRequest(req);
  }

  // Abstract function for calling registers before the original method
  function _abstractRouteMethod(functionName) {
    var funcSuper = _this[functionName];
    _this[functionName] = function(req, res) {
      _execRouteMethod(req, res);
      funcSuper(req, res);
    }
  }

  // Loop for all method that have req and res arguments
  for(var functionName in this) {
    if(typeof this[functionName] == 'function') {
      var args = /function[^\(]*\(([^\)]*)\)/.exec(
        this[functionName].toString()
      );
      if(args && args.length > 1) {

        args = args[1].split(',').map(function(arg) {
          return arg.trim()
        });

        if(args.length == 2 && args[0] == 'req' && args[1] == 'res') {
          _abstractRouteMethod(functionName);
        }
      }
    }
  }

};

现在您可以在任何控制器中调用它:

var MainController = require('./MainController');
MainController.call(MyController);

您的服务可以使用reqres 注册。例如,我在我的 ActiveUserService 中使用它,如下所示:

var _request = null;

var ActiveUserService = {

  registerRequest: function(req) {
    _request = req;
  },

  isConnected: function () {
    return _request && _request.session.user ? true : false;
  },

  // ...

};

【讨论】:

    【解决方案2】:

    Sails 中的会话对象不是作为全局对象提供的;它是Request 对象的属性。对于不包含请求作为范围一部分的服务器端代码(如服务和模型),您需要将请求或会话作为参数传递给您的函数:

    modules.exports.test = function(session) {
       ...
    }
    

    并使用 MyService.test(req.session) 从控制器调用它。

    请注意,对于视图,req 在默认情况下与本地视图一起传递,因此您可以(在 EJS 中)执行以下操作:

    <%= req.session.myVar %>
    

    【讨论】:

    • 感谢您的回答,但我遇到了同样的问题,但我仍然对如何对模型做同样的事情感到有点迷茫 - 更具体地说,对于模型生命周期回调,如 beforeCreate: fn(values , cb)。任何帮助是极大的赞赏! :)
    • 你不能在生命周期回调中直接访问会话,除非你把它作为属性值传递给createupdate,这是一个糟糕的主意。您可以在生命周期回调中执行的任何操作,您也可以使用自定义控制器操作或服务执行;这就是你的会话处理逻辑应该去的地方。请参阅this answer,以更完整地解释为什么您只能在请求的上下文中访问会话。
    猜你喜欢
    • 2013-05-28
    • 2019-01-27
    • 2014-08-11
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2011-12-13
    • 2013-10-08
    相关资源
    最近更新 更多