Send data by parts in node.js express

折月煮酒 提交于 2020-04-09 20:55:35

问题


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:

  1. Is there a method on response to send data by parts?
  2. What does response.end()?
  3. 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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!