Axuttaja
Axuttaja

Reputation: 312

Node.js Mongoskin collection iteration > Jade

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

Answers (1)

Ben
Ben

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

Related Questions