【发布时间】:2014-04-03 09:37:31
【问题描述】:
在控制器中,这很容易。访问会话变量很简单:
req.session.x = 1
但是,我如何访问该外部控制器?喜欢服役吗?
module.exports.test = function() {
// No req.session here?
};
【问题讨论】:
-
只需将 req.session 作为参数传递给服务的方法
在控制器中,这很容易。访问会话变量很简单:
req.session.x = 1
但是,我如何访问该外部控制器?喜欢服役吗?
module.exports.test = function() {
// No req.session here?
};
【问题讨论】:
您可以创建一个主控制器,它将在您的所有服务中为每个调用的路由控制器注册req 和res。
这是我的主控制器的代码:
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);
您的服务可以使用req 和res 注册。例如,我在我的 ActiveUserService 中使用它,如下所示:
var _request = null;
var ActiveUserService = {
registerRequest: function(req) {
_request = req;
},
isConnected: function () {
return _request && _request.session.user ? true : false;
},
// ...
};
【讨论】:
Sails 中的会话对象不是作为全局对象提供的;它是Request 对象的属性。对于不包含请求作为范围一部分的服务器端代码(如服务和模型),您需要将请求或会话作为参数传递给您的函数:
modules.exports.test = function(session) {
...
}
并使用 MyService.test(req.session) 从控制器调用它。
请注意,对于视图,req 在默认情况下与本地视图一起传递,因此您可以(在 EJS 中)执行以下操作:
<%= req.session.myVar %>
【讨论】:
create或update,这是一个糟糕的主意。您可以在生命周期回调中执行的任何操作,您也可以使用自定义控制器操作或服务执行;这就是你的会话处理逻辑应该去的地方。请参阅this answer,以更完整地解释为什么您只能在请求的上下文中访问会话。