NodeJS / ExpressJS envoie la réponse d’une grande quantité de données dans 1 stream

Je suis en train de prototyper une application utilisant l’api de repos mongo natif, où Node renvoie environ 400K json. J’utilise ce qui suit pour demander à mongo d’api natif et renvoyer le résultat:

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(); 

Lorsque je tape http://localhost:8001/api/testdata via curl, la réponse est correcte (ce qui est envoyé à la console de Node à partir du console.log et ce qui est reçu par curl). Mais lorsque je l’utilise avec ajax dans mon application, le stream est… interrompu, même les data à la console de Node (Terminal) sont étranges: il comporte plusieurs EOF, et la réponse Réseau> pour l’appel des outils de développement de chrome se termine au premier EOF.

Une autre chose étrange: les data ressemblent à:

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

mais je ne peux ni référencer data.rows (il renvoie non défini) dans Node ou côté client (angular). typeof data renvoie [object Object] .

EDIT Les en-têtes de requête pour curl et angular (comme indiqué par Node) sont:

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

EDIT J’ai vérifié les en-têtes de réponse à la fois angulars et curl directement (au lieu de Node), et il y a un désaccord (même résultat de curl et angular directement au lieu de noeud):

 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" 

Http.request () du nœud retourne les données sous forme de morceaux pour le streaming (ce serait bien s’ils l’indiquent explicitement). Il est donc nécessaire d’écrire chaque morceau dans le corps de la réponse d’Express, d’ écouter la fin de la requête http (qui n’est pas vraiment documentée), puis d’appeler response.end() pour terminer la réponse.

 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(); 

response est la réponse de Express à la demande initiale du client (appel ajax de curl ou angular).