Reputation: 312
I'm trying to iterate trough a collection to create a table of contents and show it to user trough jade, yet tableContent is 'No Orders' every time I run, even tough I think I have set the db correctly.
"listing.js" for iterating the db collection and sending it off to jade
var express = require('express');
var router = express.Router();
var mongo = require('mongoskin');
var db = mongo.db("mongodb://localhost:27017/db", {native_parser:true});
var iterateOrders = function() {
var tableContent = ''; //TableContent Array
db.collection('orders').find({}, function(err, result) {
result.each(function(err, order) {
tableContent += '<tr>';
tableContent += '<td>' + this.orderID + '</td>';
tableContent += '<td>' + this.receiverName + '</td>';
tableContent += '<td>' + this.receiverAddress + '</td>';
tableContent += '<td>' + this.receiverEmail + '</td>';
tableContent += '<td>' + this.order + '</td>';
tableContent += '</tr>';
});
});
if (tableContent === '') {tableContent = 'No Orders';}
return tableContent;
}
router.get('/', function(req, res) {
res.render('listing', {
title: 'Orderlist:',
table: iterateOrders() });
});
module.exports = router;
I have written to the database manually using "mongo"
db.orders.insert({'orderID'...en'})
My jade implementation is
block content
table
thead
th #
th Name
th Addr
th Email
th Order
tbody= table
Upvotes: 0
Views: 286
Reputation: 5074
Returning a value using return keyword won't work in async call. You need to pass the value back in the callback. Here is the code:
var express = require('express');
var router = express.Router();
var mongo = require('mongoskin');
var db = mongo.db("mongodb://localhost:27017/db", {native_parser:true});
var iterateOrders = function(callback) {
var tableContent = ''; //TableContent Array
db.collection('orders').find({}).toArray(function(err, result) {
for (var i = 0, len = result.length; i < len; i++) {
tableContent += '<tr>';
tableContent += '<td>' + result[i].orderID + '</td>';
tableContent += '<td>' + result[i].receiverName + '</td>';
tableContent += '<td>' + result[i].receiverAddress + '</td>';
tableContent += '<td>' + result[i].receiverEmail + '</td>';
tableContent += '<td>' + result[i].order + '</td>';
tableContent += '</tr>';
}
if (tableContent === '') {tableContent = 'No Orders';}
callback(null, tableContent);
});
}
router.get('/', function(req, res) {
iterateOrders(function(err, tableContent) {
res.render('listing', {
title: 'Orderlist:',
table: tableContent
});
});
});
module.exports = router;
Upvotes: 1