2013-07-12 28 views
5

Nodeが約400Kのjsonを返すnative mongo rest apiを使用してアプリケーションをプロトタイプしています。何console.logからのノードのコンソールに出力され、どのような受信され、両方(私はカール経由http://localhost:8001/api/testdataを打つときNodeJS/ExpressJSが大量のデータを1ストリームで送信する

http.request(options, function(req) 
    { 
    req.on('data', function(data) 
     { 
console.log(data,data.rows); 
     response.send(200, data); 
     } 
    ); 
    } 
) 
.on('error', function(error) 
    { 
console.log('error\t',error); 
    response.send(500, error); 
    } 
) 
.end(); 

は、応答が適切である:私はのネイティブAPIをモンゴし、結果を返すために、彼の要求をmaketするために、次を使用しますカールによって)。しかし、私のアプリでajax経由でヒットすると、ストリームは... interuptedされ、ノードのコンソール(端末)に出力されたdataも奇妙です:複数のEOFがあり、chromeのdevツールの呼び出しのNetwork> EOF。

もう一つの奇妙なこと:dataは次のようになります。

{ 
    "offset": 0, 
    "rows": [ … ] 
} 

どちらもノードでも、クライアント側(角度)で、私は(それはundefinedを返します)data.rowsを参照することができます。 typeof data[object Object]を返します。 (ノードによって報告されるように)

EDITカール及び角度の両方について要求ヘッダーは、次のとおり

req.headers: { 
    'x-action': '', 
    'x-ns': 'test.headends', 
    'content-type': 'text/plain;charset=utf-8', 
    connection: 'close', 
    'content-length': '419585' 
} 

EDIT Iは、(代わりにノードからの)直接角度とカールの両方に応答ヘッダーをチェックし、 annndが不一致(カール及び角度の両方から直接代わりのノードから同じ出力)は次のとおり

access-control-allow-headers: "Origin, X-Requested-With, Content-Type, Accept" 
access-control-allow-methods: "OPTIONS,GET,POST,PUT,DELETE" 
access-control-allow-origin: "*" 
connection: "keep-alive" 
content-length: "65401" // <---------------- too small! 
content-type: "application/octet-stream" 
//    ^-- if i force "application/json" 
// with response.json() instead of response.send() in Node, 
// the client displays octets (and it takes 8s instead of 0s) 
date: "Mon, 15 Jul 2013 18:36:50 GMT" 
etag: ""-207110537"" 
x-powered-by: "Express" 
+1

私はヘッダーを読んで、Nodeで本文を要求し、両方のケースで何が通過しているかをトレース/プリントアウトしようとします。それはリクエスト情報やリクエストがどのように発生しているのかを理解してから、カールリクエストとajaxリクエストの違いを解決するための具体的な答えを探します(角度などのヘッダーを設定します) – shaunhusain

+0

@ shaunhusain、私はヘッダーをチェックして、それらは同じですので、私はまた 'req'オブジェクト(FileMergeで)全体をチェックし、それは_0のdifference_ – jacob

+1

を返すうわーです:)申し訳ありません私はあなたに伝えるべきか分からないマシンに送信されたデータがまったく同じで、2つの異なる方法で応答する場合、何が起こっているのか分かりません。おそらく、私たちはノードの神や角度のある神(おそらく、いくつかの低レベルのOSIの神)を怒らせたので、私たちは悔い改めなければなりません。どのようにデータをキャプチャしていますか?私は過去にたくさんの成功を収めたチャールズを使いました(これはどういうことですか?) – shaunhusain

答えて

10

ノードのhttp.request()でデータを返しますストリーミングのための(彼らが明示的にこれを述べるといいでしょう)。したがって、実際には文書化されていないExpressのレスポンス本体listen for the end of the http requestに各チャンクを書き込む必要があります。その後、response.end()を呼び出して実際に応答を完了してください。 responseエクスプレスの応答最初のクライアント要求(カールまたは角度のAJAX呼び出し)である

var req = http.request(options, function(res) 
    { 
    res.on('data', function(chunk) { response.write(chunk); }); 
    res.on('end', function() { response.end(); }); 
    } 
); 
req.on('error', function(error) { … }); 
req.end(); 

+1

これはちょうど[$リソースとAngularUIの先読みの競合と一緒に私の人生を保存したと思う](http://stackoverflow.com/questions/15930339/how-to-tie-angular-uis-typeahead -with-a-server-http-for-server-side-optimi) –

+1

実際には、パイプラインを使用して効率的な実装を行うことができます。ボイラーメッキを処理する小さなnpmパッケージがあります(これはRequestと呼ばれると思います)。 – jacob

+0

@jacodそのための任意のnpmリンク、これは私が[npmjs](https://www.npmjs.com/package/pipe)で取得するものです –

関連する問題