我使用sails.js,我想知道在一个声明为sails控制器的var上的范围var和生命周期。
var user = {};
module.exports = {
index: function (req, res) {
user.connected = false;
return res.view({
user: user
});
},
member: function (req, res) {
user.connected = true;
return res.view('home/index', {
user: user
});
}
};
首先,我尝试仅在user
函数中设置member
,但在访问/ member网页后,用user.connected=true
初始化了用户,当我访问/ {索引页面仍然连接。所以我将user.connected=false
添加到index
函数中,它的工作方式与预期的一样。
但我根本不理解。据我所知,user
是HomeController.js
脚本的局部变量,每次加载文件时都应将其销毁,并在每次调用时重置为{}
。
实际上,当我写这个问题时,我想到了一些事情......
因为我使用module.exports
,函数索引和成员被加载到内存中,调用不是在HomeController.js
脚本上完成,而是在module.exports
全局对象上完成,因为user
是一个对象,他被“指针”引用,它不是一个副本,而是每个函数内部的引用,所以当我对它进行更改时,它会在使用引用的每个地方都被更改。它就像一个模块中的全局对象,很奇怪。
我是对的吗?我错过了什么?你有更高级的解释吗?感谢。
答案 0 :(得分:1)
我不熟悉帆,但你在这里遇到的问题是每个请求都会将用户写入该模块变量,并且在处理时会遇到各种各样的混淆并发请求。在请求持续时间内保留变量的标准方法是将其附加到请求对象:
module.exports = {
index: function (req, res) {
if (!req.user) {
// You'll probably have resolved a user and appended it to req in an
// Earlier middleware.
req.user = {};
}
user.connected = false;
res.view({ user: req.user });
},
member: function (req, res) {
if (!req.user) {
req.user = {};
}
user.connected = true;
res.view('home/index', { user: req.user });
}
};