2017-02-18 6 views
1

私はNode.JS/Expressアプリケーションを開発中です。私はJadeをテンプレートエンジンとして使用しています。私はいくつかの奇妙な行動を経験しています。Node.JS Express Promiseの問題

私は単純な配列を私のJadeテンプレートに返すモック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

ありがとうございます。私はそれを見ていないと信じられず、それは間違いのダムを作った。 –