2017-02-18 76 views
1

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

我有一个模拟API,返回一个简单的数组到我的Jade模板。我从服务器的角度验证了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); 
    }); 
    } 
} 

什么可能我是做错了什么?

+0

'res.render( '技能',属性)'应该是里面'then'声明。 – Hosar

回答

2

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

你需要把res.render.then()方法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) 
    }); 
}); 
+0

谢谢。我不敢相信我没有看到那个,那个oi让这个愚蠢的错误。 –