2017-03-03 244 views
0

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

回答

0

問題是在這裏request.on('data',request引用瀏覽器請求。

由於exec的回調函數是以行爲參數調用的,因此您不能使用.exec()進行流式傳輸。

要使用streaming,使用.execute()方法,該方法通過一個結果給回調函數。

我從來沒有使用過hdb,所以我不能給使用的代碼。

+0

你的意思是說我應該設置數據和結束事件結果返回查詢?我試過了,但是它說result.on不是一個函數。如何可能,因爲結果不是可寫的流。 –

+0

感謝您的解決方案。我試過.execute方法,我爲我工作。但是現在我面臨着在數據事件中向瀏覽器發送塊數據的問題。我正在嘗試response.send(塊)給出錯誤「發送後無法設置標頭」。看來response.send(chunk),我只能執行一次。如果是這樣,那麼我將如何在數據事件中將塊發送到瀏覽器。 –

+0

@DeveshM正如我所說,我從來沒有使用過'hdb',所以我很抱歉我無法幫到你。 –