Node.JS Express的承诺问题

我正在研究Node.JS / Express应用程序。 我正在使用Jade作为模板引擎。 我正在经历一些奇怪的行为。

我有一个模拟API,返回一个简单的数组到我的Jade模板。 我已经从服务器的angular度validation了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) 

每当我开始启动服务器时,都会发生这种情况。 但是,只要它保持运行,后续的调用就可以工作,并且页面被正确渲染。

这是我的路线方法

 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) }); 

我把console.log行放在一边,试图捕捉到正在发生的事情。

我的API方法如下

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

我可能会做错什么?

您的console.log("outside promise skills length " + properties.skills.length)将在asynchronous操作完成之前运行,所以不要期望它与undefined不同。 在这种情况下,您不能访问承诺之外的skills属性。

您需要将res.render放在getAllSkills()执行的getAllSkills()方法内

 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) }); });