2012-11-04 40 views
1

我使用node.js和express。爲什麼對象的引用被替換爲其值

我在'req.session'上保存了一個包含對象數組的複雜對象。另外我保存對數組中其中一個對象的引用。 例如:

var value = { 
    name: "name" 
    , values: [] 
}; 

req.session.value = value; 

// 
// I populate 'req.session.value' with values (with the same structure) 
// 

// then I save reference to one of the inner objects 

var currentValue = req.session.value[3]; 

// 
// later I try to change the save object 
// 

currentValue.name = "newName"; 

我預計,如果我改變了「currentValue」,那麼「req.session.value[3]」也將被改變。但是,由於某種原因,它不會發生。

要具體,如果我改變currentValue後我給你它那麼req.session.value[3]改變,但如果我在未來的呼叫做,然後就在currentValue改變。

在這個例子中:我做任務到「req.session」中的「app.get(...)」如果我改變了「app.get(...)」它運行正常(價值在兩地改變)currentValue的價值,但如果我在'app.post(...)'中更改它,更改的唯一對象是currentValuereq.session.value[3]保持不變。

由於提前,

的代碼:

'app.get("/template/:templateid/feature/add", isTemplate, function(req, res) {' 
' if (!req.session.features) { // if features empty' 
'' 
' // Save the first features level from the current template in the session ' 
' req.session.features = req.session.template.feature;' 
' //' 
' if (!req.session.featureNodes) { // featureNotes is a stack/branch of the features' 
'  req.session.featureNodes = [];' 
' }' 
' if (!req.query.featureroot || req.query.featureroot == "") {' 
' } else {' 
'  var featureRoot = getFeature(req.query.featureroot, req.session.features); // get one object from req.session.features' 
'  if (featureRoot) {' 
'   req.session.featureNodes.push(featureRoot);  // save reference' 
'   var featureR = req.session.featureNodes.pop(); // do check that work!' 
'   var values = {' 
'    name: "req.body.name"' 
'    , description: "req.body.description"' 
'    , wieght: "req.body.wieght"' 
'    , created: new Date()' 
'    , modified: new Date()' 
'    , feature: []' 
'   };' 
'' 
'   featureR.feature.push(values); // also req.session.features changed' 
'   req.session.featureNodes.push(featureRoot); // push the reference back for use later' 
'  }  ' 
' }' 
' res.render("addfeature2template.jade", { ' 
'  title: "Add new feature"' 
'  ,template: req.session.template' 
'  ,feature: req.session.featureNodes' 
' });' 
'});' 
'' 
'app.post("/feature/add", isUser, function(req, res) {' 
' var SUBMIT = "Create";' 
' var CANCEL = "Cancel";' 
' switch (req.param("feature")) {' 
'  case SUBMIT:' 
'   var fields = { name: 1, description: 1, wieght: 1};' 
'   var values = {' 
'    name: req.body.name' 
'    , description: req.body.description' 
'    , wieght: req.body.wieght' 
'    , created: new Date()' 
'    , modified: new Date()' 
'    , feature: []' 
'   };' 
'   if (req.session.featureNodes.length < 1) {' 
'    req.session.features.push(values);' 
'   } else {' 
'    var featureRoot = req.session.featureNodes.pop(); // pop the reference' 
'    featureRoot.feature.push(values);     // change the object but the req.session.features didnt changed ' 
'   }' 
'   req.session.template = template;' 
'   res.redirect("/template/" + req.body.templateid);' 
'  break;' 
'  case CANCEL:' 
'   res.redirect("/template/" + req.body.templateid);' 
'   break;' 
' }' 
'});' 
+1

如果'req.session.value [3]'作爲一個字符串開始,那麼在任何情況下* ever *都不會*在分配對'req.session.value [3]有任何影響後再次更改'currentValue' ]'。這只是JavaScript的工作方式;如果你認爲你看到了這種情況,那麼你就會誤解某些東西(很難說出你發佈的內容)。 – Pointy

+0

oops,我寫道:「var currentValue = req.session.value [3];」但我修正「var currentValue = req.session.value.values [3];」 - 現在是否合理? – user1798168

+0

JavaScript中的賦值語句總是隻是複製值。你不能讓一個變量成爲另一個變量或對象屬性(這是數組元素)的別名。 – Pointy

回答

0

req.session對象在請求之間序列化(存儲)。

實施例:

請求1:

req.session = {}; 
var a = { hello : 'world' }; 
var b = a; 
req.session.a = a; 
req.session.b = b; 

在這種情況下變量abreq.session.areq.session.b指向一個對象。您可以在任何這些對象中更改字段hello,並且這將在每個對象中更改。

請求結束後req.session對象將被序列化爲會話存儲(memcached,mongodb等)。

請求2:

請求2 req.session對象之前,將來自存儲被反序列化。現在它包含沒有引用的普通值。您可以訪問req.session.areq.session.b,但現在它有兩個不同的對象。

相關問題