2016-09-04 5 views
0

Dies ist mein Beitrag Route anzuzeigen:Express Pass Werte in Route mit ejs

// CRUD posts. 
app.post('/crud', function(req, res) { 
    db.users.addPost(req.body); 
    res.redirect('crud') 
}); 

Das ist meine Route planen:

app.get('/crud', function(req, res) { 
    res.render('crud', { 
    user: req.user, 
    posts: db.users.retrievePost() 
    }); 
}); 

Dies ist die Funktion, die ich verwende Beiträge aus meiner Datenbank abrufen :

// Retrieve posts from database to pass to view. 
exports.retrievePost = function() { 
    var cursor = postsCollection.find().toArray(function(err, record) { 
    console.log(record); 
    return record; 
    }); 
} 

Wenn ich Rekord einzuloggen, es gibt die folgenden Daten:

[ 
    { _id: 57cb835ba8b8250bdcd65e5d, userCreate: 'This is a question' }, 
    { _id: 57cb85709435720c055b10e6, userCreate: 'hello' }, 
    { _id: 57cb87b10dc3ec0c3a78f970, userCreate: 'hello' }, 
    { _id: 57cb87c20dc3ec0c3a78f971, userCreate: 'what up here' } 
] 

So verwende ich ejs, um die userCreate-Werte in meiner "Crud" -Ansicht anzuzeigen.

<ul class="posts"> 
    <% for(var i=0; i<posts.length; i++) { %> 
    <li class="post"> 
    <span><%= posts[i].userCreate %></span> 
    </li> 
    <% } %> 
</ul> 

Der Fehler ist: Kann nicht Eigenschaft 'Länge' undefinierter lesen.

Warum sollten Beiträge nicht definiert sein? In meiner get Route, als ich die Ansicht gerendert habe, habe ich den Wert von retrievePost() den Posts zugewiesen. Ich habe dann Beiträge von dieser Ansicht aufgerufen, die gerendert wurde. Wir können davon ausgehen, dass die Funktion ordnungsgemäß exportiert wird, da ich andere Funktionen aus derselben Datei in derselben Routes-Datei verwende. Was ist hier falsch?

Ich möchte diesen Beitrag die Tatsache hinzufügen, dass ich

title : "testing" 

getestet vorbei und konnte es in der folgenden Art und Weise machen:

<%= title %> 

Also ich bin wirklich nicht sicher, warum Beiträge nicht funktionieren.

+0

Weil der Wert von 'posts', die an' res.render' übergeben wurden, nicht definiert ist. Die 'postsCollection.find()' wurde nicht zurückgegeben, und der Wert wird nie zurück gegeben. Sie müssen 'retrievePost' auch einen Rückruf annehmen (oder es mit Versprechen tun, usw.). –

+0

Ich denke ich sehe was du meinst. Die mit dem Cursor verknüpfte anonyme Funktion gibt record zurück, retrievePost() jedoch nicht. Ist das was du sagst? Wenn ja, ich denke du hast Recht. Wie hätte ich dann retrievePost() die Daten anstelle der anonymen Funktion zurückgeben sollen? –

Antwort

0

Wie ich in meinem Kommentar beschrieben: Das Problem ist der Wert posts an res.render übergeben ist undefined. Die postsCollection.find() wird nicht zurückgegeben, und der Wert wird auf keinen Fall zurück. Sie müssen retrievePost auch einen Rückruf annehmen (oder tun Sie es mit Versprechungen, usw.).

Dies ist eine sehr grundlegende Implementierung des erforderlichen Verhaltens.

app.get('/crud', function(req, res) { 
    // call passing in a callback 
    db.users.retrievePost(function(err,result) { 
     // call render inside this call back, after result has been retrieved 
     res.render('crud', {user: req, user, posts: result}); 
    }) 
}); 

// Retrieve posts from database to pass to view. 

exports.retrievePost = function(callback) { 
    var cursor = postsCollection.find().toArray(function(err, record) { 
     console.log(record); 
     // naively just invokes the passed callback 
     // you could also do error handling or other processing 
     // here as well, before passing back the result through the callback 
     callback(err,record); 
    }); 
} 
+0

Das hat funktioniert. Ich muss diese Funktionalität studieren. Ich bin etwas verwirrt darüber, wie Daten von der exportierten Funktion zurück in diesen Funktionsparameter und zurück zu der Position des Parameters gelangen. –

+0

@ manbearpig1 Es funktioniert ganz nach unten. Sie rufen Funktionen auf und übergeben Parameter, die Funktionen sind. Wenn die aufgerufene Funktion beendet ist, ruft sie die Funktion von dem Parameter auf (der den Code aufruft, den Sie in der aufrufenden Funktion definiert haben). Es ist weniger verwirrend, wenn Sie nicht zu viel nachdenken. :-) Grundsätzlich ist es eine von vielen Strategien, mit Asynchronität umzugehen. Callbacks sind die ältesten der üblichen Methoden, um damit umzugehen, aber ich würde auch vorschlagen, dass Sie in Promises schauen, minimal der JS-Variante, aber wahrscheinlich mit einer Bibliothek wie Bluebird. –