2017-02-18 4 views
1

Node.JS/Express 응용 프로그램에서 작업하고 있습니다. Jade를 템플릿 엔진으로 사용하고 있습니다. 나는 이상한 행동을 경험하고있다.Node.JS Express 약속 문제

나는 옥 (Jade) 템플릿에 단순한 배열을 반환하는 mock API를 가지고 있습니다. API가 서버 관점에서 작동하는지 확인했습니다. 나는 서버에게 내가 특정 페이지로 이동 처음 시작할 때마다 그러나, 나는 오류를

TypeError: Cannot read property 'length' of undefined 
    at routes.js:28:34 
    at Layer.handle [as handle_request] (E:\dev\code\javascript\ps_resume_express\node_modules\express\lib\router\layer.js:95:5) 
    at next (E:\dev\code\javascript\ps_resume_express\node_modules\express\lib\router\route.js:131:13) 
    at Route.dispatch (E:\dev\code\javascript\ps_resume_express\node_modules\express\lib\router\route.js:112:3) 
    at Layer.handle [as handle_request] (E:\dev\code\javascript\ps_resume_express\node_modules\express\lib\router\layer.js:95:5) 
    at E:\dev\code\javascript\ps_resume_express\node_modules\express\lib\router\index.js:277:22 
    at Function.process_params (E:\dev\code\javascript\ps_resume_express\node_modules\express\lib\router\index.js:330:12) 
    at next (E:\dev\code\javascript\ps_resume_express\node_modules\express\lib\router\index.js:271:10) 
    at Function.handle (E:\dev\code\javascript\ps_resume_express\node_modules\express\lib\router\index.js:176:3) 
    at router (E:\dev\code\javascript\ps_resume_express\node_modules\express\lib\router\index.js:46:12) 

를받을이 내가 서버를 시작할 시작할 때마다 발생합니다. 그러나 실행이 지속되는 동안 후속 호출이 작동하고 페이지가 제대로 렌더링됩니다.

여기에 내가 시도하고 무슨 일이 일어나고 있는지 캡처 CONSOLE.LOG 라인에 넣어

router.get('/skills', (req, res) => { 
     console.log('received request for skills'); 
     resumeAPI.getAllSkills().then((skills) => { 
     console.log("inside then skills length " + skills.length); 
     properties.skills = skills; 
     console.log("inside then properties.skills length " + properties.skills.length); 
     }); 
     console.log("outside promise skills length " + properties.skills.length); 
     properties.heading = 'Skills'; 
     res.render('skills', properties) 
    }); 

내 경로 방법입니다. 내가 잘못하고있을 수도 있습니다 무엇

class ResumeApi { 
    static getAllSkills() { 
    return new Promise((resolve, reject) => { 
     console.log("from api skills " + skills.length); 
     resolve(skills); 
    }); 
    } 
} 

을 다음과 같이

내 API의 방법은?

+0

실행 getAllSkills() 방법 .then() 내부'res.render ('기술', 속성)을 둘 필요가'안에'then' 문이어야한다. – Hosar

답변

2

console.log("outside promise skills length " + properties.skills.length)은 비동기 작업이 실행되기 전에 실행되므로 정의되지 않은 작업이 아닌 것으로 예상하지 마십시오. 이 경우 약속 외의 skills 속성에 액세스 할 수 없습니다.

당신은 res.render

router.get('/skills', (req, res) => { 
    resumeAPI.getAllSkills().then((skills) => { 
    properties.skills = skills; 

    // res.render goes HERE, otherwise it will not have the skills property inside properties object 
    properties.heading = 'Skills'; 
    res.render('skills', properties) 
    }); 
}); 
+0

감사. 나는 내가 그것을 보지 못했다는 것을 믿을 수 없다. 그리고 그 oi는 그 실수를 바보로 만들었다. –