0

我想在 nodejs 应用程序中找到所有用户并显示它们。

应用程序.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()
    }
  );
});

用户.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不是空列表?

4

1 回答 1

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?
}
于 2013-07-24T18:52:40.543 回答