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
,所以我不能给使用的代码。
你的意思是说我应该设置数据和结束事件结果返回查询?我试过了,但是它说result.on不是一个函数。如何可能,因为结果不是可写的流。 –
感谢您的解决方案。我试过.execute方法,我为我工作。但是现在我面临着在数据事件中向浏览器发送块数据的问题。我正在尝试response.send(块)给出错误“发送后无法设置标头”。看来response.send(chunk),我只能执行一次。如果是这样,那么我将如何在数据事件中将块发送到浏览器。 –
@DeveshM正如我所说,我从来没有使用过'hdb',所以我很抱歉我无法帮到你。 –