Je cherchais sur le Web et dans la documentation de node.js
module express
et il semble qu’il n’y ait aucun moyen d’envoyer des données par parties. J’ai un fichier rendu pas très rapide et je veux envoyer des parties avant que tout soit rendu.
Donc, voici mes questions:
response
pour envoyer des données par parties? response.end()
? Exemple de code simplifié:
app.get(..) { renderFile(file, function(data) { response.send(data); }); response.end(); )
Ce morceau de code envoie uniquement le premier bloc de données. J’ai vérifié – les données sont données correctement et le rappel est appelé plus d’une fois.
Bien sûr, je peux append des données à une variable, puis écrire response.send(data);
mais je n’aime pas cette approche – ce n’est pas ainsi que cela devrait fonctionner.
L’object de response
est un stream accessible en écriture. Il suffit d’écrire dessus et Express configurera même automatiquement le codage par blocs.
response.write(chunk);
Vous pouvez également y accéder si tout ce qui crée ce “fichier” se présente comme un stream lisible. http://nodejs.org/api/stream.html
Express étend Connect qui étend HTTP, je crois. En regardant l’ API HTTP , il semble que ce que vous recherchez, c’est response.write
, qui prend un bloc de données à envoyer comme corps de réponse. Je crois alors que vous pouvez utiliser response.end
sur le signal final.
Pour ce faire, il suffit de convertir les données en un stream lisible et de les diriger vers l’object de réponse. voici mon code nodejs. espérons que cela pourrait aider
var express= require('express'); var bodyParser = require('body-parser'); const JSONStreamSsortingngify = require('json-stream-ssortingngify'); var app=express(); var jsonParser = bodyParser.json(); app.post('/node_test_pipe', jsonParser, function (req, res) { console.log("Request from:"+req.url); var obj={ my:1, two:2 } JSONStreamSsortingngify(obj).pipe(res); var obj={ my:3, two:4 } JSONStreamSsortingngify(obj).pipe(res); }); app.listen(8080);
L’object de réponse peut être écrit. Dans votre cas, ce qui suit serait une solution:
renderFile(file, function(data) { response.send(data); }); response.end();
Si vous avez la possibilité d’obtenir le fichier sous forme de stream, vous pouvez le rationaliser davantage:
file.getReadableStream().pipe(response);