如何防止会话变量发生变化?

时间:2013-05-14 00:11:17

标签: node.js express

所以我有一个会话变量req.session.user,它包含一个与用户帐户对应的对象。当我这样做时,

var user = req.session.user;
var fakeUser = user;
fakeUser.username = 'bob';

user.username和req.session.user.username也都变为'bob'。我该如何防止这种情况?

2 个答案:

答案 0 :(得分:0)

当您编写var fakeUser = user时,您复制对对象用户的引用 - fakeUser仍然引用同一对象。

如果要复制对象,则必须克隆它或仅复制用户所需的属性:例如:

var fakeUser = {
  name: user.name,
  id: user.id
}

JS clonning在以下答案中描述:

answer 1 answer 2

你也可以使用clone method下划线库(但要注意它只是一个浅的副本(不深) - 即如果用户对象包含一些引用,它们将被复制为引用)。

克隆对象的简单方法是对其进行序列化和反序列化(但这不适用于循环引用 - 当对象引用自身或它的部分时):

function clone(a) {
   return JSON.parse(JSON.stringify(a));
}

答案 1 :(得分:0)

克隆它

function clone(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
    }
    return copy;
}