Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在node.js express中按部件发送数据_Node.js_Express - Fatal编程技术网

在node.js express中按部件发送数据

在node.js express中按部件发送数据,node.js,express,Node.js,Express,我在网上和文档中搜索node.jsexpress模块,似乎没有办法按部件发送数据。我有一个文件渲染不是很快,我想发送它的一部分之前,一切渲染 下面是我的问题: 在响应上是否有按部件发送数据的方法 response.end()的作用是什么 如果无法按部件发送数据,那么背后的原理是什么?如果这是真的,我会说它看起来更像是阻塞而不是非阻塞。如果数据提前提供,浏览器可以更快地加载信息 简化代码示例: app.get(..) { renderFile(file, function(data) {

我在网上和文档中搜索
node.js
express
模块,似乎没有办法按部件发送数据。我有一个文件渲染不是很快,我想发送它的一部分之前,一切渲染

下面是我的问题:

  • 响应
    上是否有按部件发送数据的方法
  • response.end()的作用是什么
  • 如果无法按部件发送数据,那么背后的原理是什么?如果这是真的,我会说它看起来更像是阻塞而不是非阻塞。如果数据提前提供,浏览器可以更快地加载信息
  • 简化代码示例:

    app.get(..) {
      renderFile(file, function(data) {
        response.send(data);
      });
      response.end();
    )
    
    这段代码只发送第一块数据。我检查了-数据给出正确,并且多次调用回调


    当然,我可以将数据附加到一个变量中,然后编写
    response.send(data)
    但是我不喜欢这种方法-它不是应该工作的方式。

    响应对象是一个可写流。只需写入它,Express甚至会自动为您设置分块编码

    response.write(chunk);
    

    如果创建这个“文件”的任何东西都以可读流的形式出现,那么您也可以通过管道连接到它

    Express扩展了Connect,我相信它扩展了HTTP。看一下,您要查找的似乎是,它需要一大块数据作为响应体发送。我相信您可以使用结束信号。

    响应对象可以写入。在您的情况下,以下是一个解决方案:

    renderFile(file, function(data) {
      response.send(data);
    });
    response.end();
    
    如果您有机会将文件作为流获取,则可以进一步简化:

    file.getReadableStream().pipe(response);
    

    实现这一点的简单方法是将数据转换为可读的流,并通过管道将其传输到响应对象。 这是我的nodejs代码。希望这能有所帮助

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

    除了使用
    Response.write()
    方法分块发送和
    Response.end()
    标记结束之外

    如果你有一条小溪!您可以将它直接输送到响应对象!所有这些都会自动处理

    有关文件可读流,请参见下面的示例:

    var http=require('http');
    var fs=需要('fs');
    http.createServer(函数(req,res){
    //文件名在本地目录中很简单,并固定在请求的url上
    var filename=\uuuu dirname+req.url;
    //此行将文件作为可读流打开
    var readStream=fs.createReadStream(文件名);
    //这将一直等到我们知道可读流实际上是有效的,然后再进行管道传输
    readStream.on('open',函数(){
    //这只是将读取流通过管道传输到响应对象(该对象将发送到客户端)
    
    readStream.pipe(res);//请详细说明管道并给出一个例子。我觉得这对很多人来说都非常相关,因为在很多情况下,它实际上是一个更好的解决方案。@NielsAbildgaard我不能给出一个具体的例子,因为问题中的代码没有提供任何关于数据来源的上下文。
    sourceStream.pipe(response)
    就可以了。
    const fs = require('fs');
    const r = fs.createReadStream('file.txt'); // read stream
    const z = zlib.createGzip(); // write stream
    const w = fs.createWriteStream('file.txt.gz'); // write stream
    r.pipe(z).pipe(w);