2017-01-27 7 views
0

この問題は、ノード6.9.4と7.0.0の両方で発生します。理由はわかりません。私は他のバージョンではテストしていません。以下のNode.jsプログラムのコメントを参照してください。なぜこの字句の範囲が一致しないのですか?

const express = require('express'); 
const adaro = require('adaro'); 

const app = express(); 

const tabs = require('./config/tabs.json'); 
const config = require('./config/locals.js'); 

function getLocals(name) { 
    const modifiedTabs = config.tabs.map(tab => { 
    return Object.assign(tab, {active: tab.name === name}); 
    }); 

    return Object.assign({tab: name}, config, {tabs: modifiedTabs}); 
} 

app.engine('dust', adaro.dust()); 
app.set('view engine', 'dust'); 
app.set('x-powered-by', false); 

app.use(express.static('static')); 

tabs.map(tab => tab.name).forEach(name => { 
    const locals = getLocals(name); 
    const tab = locals.tabs.find(tab => tab.active); 

    // these are always true 
    console.log(tab === locals.tabs.find(tab => tab.active)); 

    function callback(req, res) { 
    // const locals = getLocals(name); 
    // this should be true, but is false unless the line above is commented in 
    console.log(tab === locals.tabs.find(tab => tab.active)); 
    res.render('main', locals); 
    } 

    if (tab.url !== '/' + tab.id) { 
    app.get(tab.url, callback); 
    } 

    app.get('/' + tab.id, callback); 
}); 

app.all('*', function (req, res) { 
    res.sendStatus(404); 
}); 

app.listen(process.env.PORT || 8000); 

誰にこのようなことが起こっているのか、それを修正する方法を説明できますか?

+1

ログアウト 'locals'と' getLocals(名前は) 'ラインであなたがコメントアウトしています。私の推測では、あなたはどこかにオブジェクトを突然変異させ、それを実現していないので、彼らは異なっているでしょう。 – cdhowie

+0

* facepalm *突然変異が見つかりました: 'Object.assign(タブ、{アクティブ:tab.name ===名前})'行11 ... –

答えて

0

問題が見つかりました。 getLocals()では、私は

const modifiedTabs = config.tabs.map(tab => { 
    return Object.assign(tab, {active: tab.name === name}); 
}); 

を実行していObject.assign(tab, ...)は、それぞれのタブにのみ、最後の割り当てを残して、既存のtabオブジェクトにそれが呼ばれるたびに上書きされます。そのため、すべてのビューでは、アレイ内の最後のタブがアクティブなものとして表示されます。これは、すべてのactiveプロパティが最後のタブの設定で上書きされているためです。

ソリューションは、Object.assign()に引数を切り替えることだったので、返されたオブジェクトが上書きされたのではなく、作成されたこと:

return Object.assign({active: tab.name === name}, tab); 
関連する問題