NodeJS&Express中的Stream Rest API HTTP响应

问题描述:

我正在NodeJS和Express中创建Rest API。它连接远程HANA数据库&执行一个查询。现在我想传输http响应,以便我可以将它发送到浏览器分块,而不是完全发送它,因为它是一个非常大的数据。NodeJS&Express中的Stream Rest API HTTP响应

我尝试一些东西,是给我任何输出。我不知道原因。如果我使用response.send(data)发送完整的响应给浏览器,它工作正常。但流式传输正在工作。

我已经添加下面的代码片段。请帮忙。

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

问题是在这里request.on('data',request引用浏览器请求。

由于exec的回调函数是以行为参数调用的,因此您不能使用.exec()进行流式传输。

要使用streaming,使用.execute()方法,该方法通过一个结果给回调函数。

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

+0

你的意思是说我应该设置数据和结束事件结果返回查询?我试过了,但是它说result.on不是一个函数。如何可能,因为结果不是可写的流。 –

+0

感谢您的解决方案。我试过.execute方法,我为我工作。但是现在我面临着在数据事件中向浏览器发送块数据的问题。我正在尝试response.send(块)给出错误“发送后无法设置标头”。看来response.send(chunk),我只能执行一次。如果是这样,那么我将如何在数据事件中将块发送到浏览器。 –

+0

@DeveshM正如我所说,我从来没有使用过'hdb',所以我很抱歉我无法帮到你。 –