2017-03-03 6 views
0

NodeJSとExpressでRest APIを作成しています。リモートHANAデータベース&と1つのクエリを実行します。今私は非常に大きなデータであるので、それを完全に送信するのではなく、チャンクにブラウザに送信できるようにHTTP応答をストリーミングしたいと思います。NodeJSとExpressのストリームレス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(チャンク)のようです、私は1回だけ実行できます。もしそうなら、私はどのようにデータイベントでブラウザにチャンクを送るでしょう。 –

+0

@DeveshM私が言ったように、私は決して 'hdb'を使用しなかったので、私はあなたをさらに助けることはできません申し訳ありません。 –

関連する問題