Stream from a mongodb cursor to Express response in node.js


I am toying around with all the fancy node.js/mongodb/express platforms, and stumbled across a problem:

app.get('/tag/:tag', function(req, res){
  var tag=req.params.tag;
  console.log('got tag ' + tag + '.');
  catalog.byTag(tag,function(err,cursor) {
     if(err) {
     } else {
       res.writeHead(200, { 'Content-Type': 'application/json'});

       //this crashes;


As you probably guessed, catalog.byTag(tag, callback) does a find() query to Mongodb and returns the cursor

This leads to an error:

TypeError: first argument must be a string or Buffer

According to mongodb driver doc,
I tried to pass this converter to stream():

function(obj) {return JSON.stringify(obj);}

but that does not help.

Can anybody tell me how to correctly stream something to a response?

Or is the only solution a boilerplate to manually pump the data using the ‘data’ and ‘end’ events?


A working combination of other answers here

app.get('/comments', (req, res) => {

  • cursor() returns a Node streams3 compatible stream and is preferred over the deprecated interface.
  • Piping to JSONStream.stringify() to combine documents into an array instead of single objects
  • Piping to res.type('json') which sets the HTTP Content-Type header to application/json and returns itself (the response stream) again.

Answered By – sshow

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published