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, {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);