1

node.jsとexpressを使用しています。

req.sessionオブジェクトの配列を含む複雑なオブジェクトを''に保存しました。さらに、配列内のオブジェクトの1つへの参照を保存します。例えば:

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(...)」の値を変更すると、正常に実行されます(両方の場所で値が変更されます)が、「」で変更した場合は、変化するオブジェクトは、左は同じです。currentValueapp.get(...)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;'
'    }'
'});'
4

1 に答える 1

0

req.sessionオブジェクトは、リクエスト間で(保存するために)シリアル化されます。

例:

リクエスト1:

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

このコンテキストでは、変数、、、はa1つのオブジェクトを指します。これらのオブジェクトのいずれかでフィールドを変更できます。これにより、各オブジェクトで変更されます。breq.session.areq.session.bhello

リクエストの終了後、req.sessionオブジェクトはセッションストレージ(memcached、mongodbなど)用にシリアル化されます。

リクエスト2:

リクエスト2の前にreq.session、オブジェクトはストレージから逆シリアル化されます。これで、参照のないプレーンな値が含まれます。アクセスできますがreq.session.areq.session.b現在は2つの異なるオブジェクトにアクセスできます。

于 2012-11-05T00:02:40.893 に答える