0

nodejs アプリ内のすべてのユーザーを検索して表示したいと考えています。

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

4

1 に答える 1

1

あなたのコードには2つの問題があります。

まず第一に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 に答える