2016-08-18 6 views
0

HTTPメソッドを使用して2つの独立したMongoDB結果をExpressアプリケーションで送信するベストプラクティスは何ですか?Express js app.getコールバックで複数の独立した応答データを取得する方法

はここでそれが明らかに短い例です:

//app.js 
var express = require('express'); 
var app = express(); 
var testController = require('./controllers/test'); 
app.get('/test', testController.getCounts); 
... 

getCounts後()私は二回の応答を送信することはできませんので、機能が動作しません。

///controllers/test 
exports.getCounts = function(req,res) { 
    Object1.count({},function(err,count){ 
    res.send({count:count}); 
    }); 
    Object2.count({},function(err,count){ 
    res.send({count:count}); 
    }); 
}; 

とにかく、1つのレスポンスオブジェクトに2つのカウントが必要です。

Object1のコールバックでObject2.countを互いに依存しなくてもいいですか?

それ以外の方法で再設計する必要はありますか?

ありがとうございました!

答えて

1

あなたは、このタスクを達成するための約束を使用する必要があります。

Promise.all
function getCount(obj) { 
    return new Promise(function (resolve, reject) { 
     obj.count({}, function(err,count) { 
      if(err) reject(); 
      else resolve(count); 
     }); 
    }); 
} 

次の2つの要求をトリガし、応答を呼び出す

exports.getCounts = function(req,res) { 
    Promise.all([getCount(Object1), getCount(Object2)]) 
    .then(function success(result) { 
     res.send({'count1':result[0], 'count2':result[1]}); 
    }); 
}); 
+0

- あなたはおそらく代わりに 'obj.getCount' の 'obj.count' を呼び出したいです。 私はそれを試しましたが、応答は{"count1":[27,1]}です。期待通りの正確さではありません。 – sachad

+0

@sachad申し訳ありません私は間違いを犯しました、私は今働くべき投稿を編集しました –

+0

ありがとう!この解決策のように。 – sachad

0

に追加するために、結果を取得することができますres.sendリクエストの応答を終了します。代わりにres.writeを使用して、クライアントにチャンクを送信し、完了したらres.endを呼び出すことができます。

例:

app.get('/endpoint', function(req, res) { 
    res.write('Hello'); 
    res.write('World'); 
    res.end(); 
}); 

あなたは提起し、問題がクライアントにJSONを送信しようとしているようしかし、それはそうです:個別オブジェクトへの書き込みは有効なJSONではありません。

例:

app.get('/endpoint', function(req, res) { 
    res.write({foo:'bar'}); 
    res.write({hello:'world'}); 
    res.end(); 
}); 

レスポンスボディが今のようになります。{foo:'bar'}{hello:'world'}有効なJSONではありません。

また、2つのdbクエリの間に競合状態が存在します。これは、レスポンス内のデータの順序がわからないことを意味します。

提案:関数同様にgetCountで

exports.getCounts = function(req,res) { 
    var output = {};  

    Object1.count({},function(err,count){ 
    output.count1 = count; 

    Object2.count({},function(err,count){ 
     output.count2 = count; 
     res.send(output); 
    }); 
    }); 
}; 

//Response body 
{ 
    count1: [value], 
    count2: [value] 
} 
関連する問題