2017-02-18 2 views
1

Ich arbeite an einer Node.JS/Express-Anwendung. Ich benutze Jade als Vorlage-Engine. Ich habe ein seltsames Verhalten.Node.JS Express-Versprechen Ausgabe

Ich habe eine Mock-API, die ein einfaches Array an meine Jade-Vorlage zurückgibt. Ich habe überprüft, dass die API aus einer Serverperspektive funktioniert. Jedes Mal, wenn ich den Server das erste Mal, dass ich auf die jeweilige Seite gehen starten erhalte ich einen Fehler

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) 

Dies geschieht jedes Mal, wenn ich die den Server starten. Solange es jedoch aktiv ist, funktionieren nachfolgende Anrufe und die Seite wird ordnungsgemäß gerendert.

Hier ist meine Strecke Methode ist

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

ich in den console.log Linien setzen, um zu versuchen und zu erfassen, was los ist.

Meine API-Methode ist wie folgt

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

Was könnte ich falsch gemacht?

+0

'res.render ('Fertigkeiten', Eigenschaften)' sollten in 'then' Anweisung setzen. – Hosar

Antwort

2

Ihr console.log("outside promise skills length " + properties.skills.length) wird ausgeführt, bevor der asynchrone Vorgang seine Ausführung beendet, also erwarten Sie nicht, dass es anders als undefined ist. In diesem Fall können Sie nicht auf die skills-Eigenschaft außerhalb des Versprechens zugreifen.

Sie müssen die res.render innerhalb .then() Methode der getAllSkills() Ausführung

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

Danke. Ich kann nicht glauben, dass ich das nicht gesehen habe und dass ich einen Fehler gemacht habe. –