2017-01-27 56 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);