【问题标题】:Stream Rest API HTTP Response in Node.js & ExpressNode.js 和 Express 中的 Stream Rest API HTTP 响应
【发布时间】:2017-03-03 06:09:36
【问题描述】:

我正在 Node.js 和 Express 中创建一个 Rest API。它与远程 HANA 数据库连接并执行一个查询。现在我想流式传输 HTTP 响应,这样我就可以将它分成块发送到浏览器,而不是完全发送它,因为它是一个非常大的数据。

我尝试了一些没有输出的东西。我不知道原因。如果我使用 response.send (data) 将完整的响应发送到浏览器,它工作正常。但流媒体现在可以工作了。

我在下面添加了代码sn-p。

const express = require("express");
const APP = express();
const HANA_DB = require('hdb');
const BODY_PARSER = require("body-parser");

start();

function start() {
    startServer();
    initializeExpress();
    APP.get("/data", function(request, response) {
        var connection = HANA_DB.createClient({
            host     : "hostname",
            port     : "port",
            user     : "username",
            password : "password"
        });
        connection.on('error', function (error) {
            console.log("Error in database connection...");
        });
        connection.connect(function (error) {
            if (error) {
                console.log("Error in database connection...");
                return;
            }
            var query = "SELECT * FROM TableName";
            connection.exec(query, function(error, result) {
                if(error) {
                    response.send("Getting error while fetching result...");
                    return;
                }
                //response.send(data);
                var datalength = 0;
                request.on('data', function(chunk) {
                    datalength += chunk.length;
                    console.log("DATA EVENT: " + datalength);
                    response.send(datalength);
                })
                .on('end', function() {
                    console.log("END EVENT: " + datalength);
                    response.send(datalength);
                });
            });
        });     
    });
};

function initializeExpress() {
    APP.all('/*', function(request, response, next) {
        response.header("Access-Control-Allow-Origin", "*");
        response.header("Access-Control-Allow-Headers", "X-Requested-With");
        response.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
        response.header('Access-Control-Allow-Headers', 'Content-Type');
        next();
    });
    APP.use(BODY_PARSER.json());
    APP.use(BODY_PARSER.urlencoded({ extended: true }));
};

function startServer(config) {
    var server = APP.listen("8081", function(error) {
        if(error) {
            console.log("Unable to connect to 127.0.0.1:8081");
            return;
        }
        console.log("Server is listening at - 127.0.0.1:8081");
    });
};

【问题讨论】:

    标签: node.js rest express stream


    【解决方案1】:

    我认为您使用的逻辑对于流式传输数据是错误的。

    使用 res.write 而不是 res.send 并且您还必须从数据库中读取流数据而不是一次性 connection.exec

    我正在给你一个示例代码,你将在其中对 Expressjs 中的流数据有所了解。

    var http = require( 'http' );
    
    http.createServer( function ( req, res ) {
    res.writeHead( 200, {
        'Content-Type': 'text/plain; charset=utf-8',
        'Transfer-Encoding': 'chunked',
        'X-Content-Type-Options': 'nosniff'
    } );
    res.write( 'Beginning\n' );
    var count = 10;
    var io = setInterval( function () {
        res.write( 'Doing ' + count.toString() + '\n' );
        count--;
        if ( count === 0 ) {
            res.end( 'Finished\n' );
            clearInterval( io );
        }
    }, 1000 );
    } ).listen( 8000 );
    

    【讨论】:

      【解决方案2】:

      问题出在request.on('data',request 指浏览器请求。

      您不能将流与.exec() 一起使用,因为exec 的回调函数是以行作为参数调用的。

      要使用streaming,请使用.execute() 方法,该方法将结果集传递给回调函数。

      我从来没有用过hdb,所以我不能给出代码来使用。

      【讨论】:

      • 你的意思是说我应该设置数据和结束事件并通过查询返回结果?我试过了,但它说 result.on 不是一个函数。怎么可能,因为 result 不是可写流。
      • 感谢您的解决方案。我尝试了 .execute 方法,它对我有用。但现在我面临着在数据事件中向浏览器发送块数据的问题。我正在尝试 response.send(chunk) ,它给出错误“发送后无法设置标题”。看来 response.send(chunk),我只能执行一次。如果是,那么我将如何在数据事件中向浏览器发送块。
      • @DeveshM 正如我所说,我从未使用过hdb,所以很抱歉我无法进一步帮助您。
      • 很抱歉再次打扰您。但我对我在寻找什么没有任何线索。现在我可以为 Hana 和 Oracle 流式传输结果。但是我无法在数据事件中将块数据发送回浏览器。你能指导我是否值得每次都发送块数据,还是应该在加载我在流结束事件中获得的完整数据后将其发送到浏览器?
      猜你喜欢
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 2020-02-04
      • 2014-09-01
      • 2016-10-01
      • 1970-01-01
      相关资源
      最近更新 更多