问题
I was searching the web and documentation for node.js
express
module and it seems there is no way to send data by parts. I have a file rendered not very fast and I want to send parts of it before everything is rendered.
So here are my questions:
- Is there a method on
response
to send data by parts? - What does
response.end()
? - If there is no way to send data by parts - what is the rationale behind? I would say it looks more blocking than non-blocking if that's true. Browser can load information faster if data is given earlier.
Sample simplified code:
app.get(..) {
renderFile(file, function(data) {
response.send(data);
});
response.end();
)
This piece of code sends only the first chunk of data. I checked - data is given correctly and callback is called more than one time.
Of course I can append data to the one variable and then write response.send(data);
but I don't like this approach - it is not the way it should work.
回答1:
The response
object is a writable stream. Just write to it, and Express will even set up chunked encoding for you automatically.
response.write(chunk);
You can also pipe to it if whatever is creating this "file" presents itself as a readable stream. http://nodejs.org/api/stream.html
回答2:
the easy way to do this is to convert the data into a readable stream and pipe it to the response object. here is my nodejs code. hope this might help
var express= require('express');
var bodyParser = require('body-parser');
const JSONStreamStringify = require('json-stream-stringify');
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
}
JSONStreamStringify(obj).pipe(res);
var obj={
my:3,
two:4
}
JSONStreamStringify(obj).pipe(res);
});
app.listen(8080);
回答3:
Express extends Connect which extends HTTP I believe. Looking at the HTTP API, it seems that what you are looking for is response.write, which takes a chunk of data to send as a response body. I then believe you can use response.end on the end signal.
回答4:
The response object can be written to. In your case, the following would be a solution:
renderFile(file, function(data) {
response.send(data);
});
response.end();
If you have the opportunity to get the file as a stream this can be streamlined further:
file.getReadableStream().pipe(response);
来源:https://stackoverflow.com/questions/17644066/send-data-by-parts-in-node-js-express