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