2017-01-27 88 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,{active:tab.name === name})'line 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);