范围var和life到sails控制器nodejs

时间:2014-01-30 16:05:01

标签: javascript node.js controller sails.js

我使用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函数中,它的工作方式与预期的一样。

但我根本不理解。据我所知,userHomeController.js脚本的局部变量,每次加载文件时都应将其销毁,并在每次调用时重置为{}

实际上,当我写这个问题时,我想到了一些事情......

因为我使用module.exports,函数索引和成员被加载到内存中,调用不是在HomeController.js脚本上完成,而是在module.exports全局对象上完成,因为user是一个对象,他被“指针”引用,它不是一个副本,而是每个函数内部的引用,所以当我对它进行更改时,它会在使用引用的每个地方都被更改。它就像一个模块中的全局对象,很奇怪。

我是对的吗?我错过了什么?你有更高级的解释吗?感谢。

1 个答案:

答案 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 });
    }
};