返回couchDB结果集以在模板中使用它

时间:2013-07-24 16:40:34

标签: node.js couchdb

我想找到nodejs app中的所有用户并显示它们。

app.js

var express = require('express');
var hbs     = require('hbs');

var app = express();    
var user = require('./user');

app.set('view engine', 'html');
app.engine('html', hbs.__express);

app.use(express.static('public'));
app.use(express.bodyParser());

app.get('/', function(req, res) {
  res.render('user/index', {
      title: "User overview", 
      users: user.all()
    }
  );
});

user.js的

var http = require('http');

var options = {
  host: 'localhost',
  port: 5984,
  path: '/user/_all_docs?include_docs=true',
  headers : {
    'accept': 'application/json'
  }
};

exports.all = function() { 
  // Store them ?
  var entries = [];

  var db_req = http.request(options, function(db_res) {
    db_res.setEncoding('utf8');

    db_res.on('data', function(data){
      entries.push(data);
    });

  });

  db_req.end();

  // Return entries somehow?
}

我理解nodejs正在执行并行请求,因此无法简单地返回条目列表。但是我需要在db_req.end()之后使用什么函数或回调来确保entries不是空列表?

1 个答案:

答案 0 :(得分:1)

您的代码有两个问题。

首先,http.request和后续响应是异步方法。所以你无法返回任何内容。从技术上讲,你可以但你无法获得返回值的句柄。这就是为什么我们有回调。所以请接受回调并调用它。

其次,db_res只有在收到下一个响应块并且块不是单独的数据块时才会发出数据事件,它们只是文本。因此,不是将每个内部推送到数组中,而是将它们连接成一个字符串,反序列化它,然后返回。像这样

exports.all = function(callback) { 
  // Store them ?
  var entries = "";

  var db_req = http.request(options, function(db_res) {
    db_res.setEncoding('utf8');

    db_res.on('data', function(data){
      entries = entries + data;
    });

    db_res.on('end', function(){
       callback(JSON.parse(data));
    });

  });

  db_req.end();

  // Return entries somehow?
}