2017-03-03 3 views
0

Ich erstelle eine Rest API in NodeJS und Express. Es verbindet sich mit Remote-HANA-Datenbank & eine Abfrage ausführen. Jetzt möchte ich HTTP-Antwort streamen, so dass ich es an den Browser in Stücke senden kann, anstatt es vollständig zu senden, da es eine sehr große Datenmenge ist.Stream Rest API HTTP Antwort in NodeJS & Express

Ich versuchte etwas, das mir keine Ausgabe gibt. Ich kenne den Grund nicht. Wenn ich die vollständige Antwort mit response.send (data) an den Browser sende, funktioniert es gut. Aber das Streaming funktioniert jetzt.

Ich habe Code-Snippet unten hinzugefügt. Bitte helfen Sie.

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

Antwort

0

Das Problem ist hier request.on('data',. request bezieht sich auf die Browseranforderung.

Sie können kein Streaming mit .exec() verwenden, weil die Callback-Funktion exec mit den Zeilen als Parameter aufgerufen wird.

Um streaming zu verwenden, verwenden Sie die Methode .execute(), die ein Resultset an die Callback-Funktion übergibt.

Ich habe nie hdb verwendet, so kann ich den Code nicht verwenden.

+0

Willst du sagen, dass ich Daten setzen und Ende-Ereignis mit Ergebnis durch Abfrage zurückgeben sollte? Ich habe es versucht, aber es sagt, dass das Ergebnis keine Funktion ist. Wie wäre es möglich, weil das Ergebnis kein beschreibbarer Stream ist. –

+0

Danke für Ihre Lösung. Ich versuchte .execute Methode und ich es funktioniert für mich. Aber jetzt habe ich Probleme mit dem Senden von Chunk-Daten an den Browser im Datenereignis. Ich versuche response.send (chunk), die Fehlermeldung "kann Header nicht festlegen, nachdem sie gesendet werden". Es scheint response.send (chunk), ich kann nur einmal ausführen. Wenn ja, wie schicke ich Chunks an den Browser im Datenereignis. –

+0

@DeveshM Wie gesagt, ich habe 'hdb' nie benutzt, also tut es mir leid, dass ich dir nicht weiterhelfen kann. –