2017-04-06 12 views
0

プログラムがリクエストの受信を停止し、ページを一度正常にロードした後にコードを続行したい。私はbreak;を関数のコードの最後に置いてみましたが、それは違法な中断だと言います。私は休憩の代わりに何を使うべきか分かりません。Node.jsの関数を終了する方法

どのように機能を終了させるべきですか?

ありがとうございます。


私はNode.jsのとthis siteから次のコードを使用しています:あなたは(return、ないbreakだろう)機能を終了じゃない

var http = require("http"); 
var port = 3000; 
var serverUrl = "localhost"; 

var Kafka = require('no-kafka'); 
var connString = ' kafka://192.168.0.108:9092, 192.168.0.108:9092 ' 
var consumer = new Kafka.SimpleConsumer({ connectionString: connString }); 

var message = ["start"]; 

var server = http.createServer(function(req, res) { 
    console.log("Request: " + req.url); 
    var now = new Date(); 
    var html = "<p>Hello World, the time is " + now + "- Messages: " + message + ".</p>"; 
    res.end(html); 
    console.log("a"); 
    server.close(); 
    console.log("b"); 
}); 

// data handler function can return a Promise 
var dataHandler = function (messageSet, topic, partition) { 
    messageSet.forEach(function (m) { 
     console.log('topic received: '); 
     console.log({ 
      'topic':topic, 
      'partition': partition, 
      'offset': m.offset, 
      'message': m.message.value.toString('utf8')  
     }); 
     message.push(m.message.value.toString('utf8')); 

     console.log("Listening at " + serverUrl + ":" + port); 
     server.listen(port, serverUrl); 

     console.log("c"); 
    }); 
}; 

return consumer.init() 
.then(function() { 
    return consumer.subscribe('temp', 0, dataHandler); 
}); 
+0

server.close(); –

+2

私は質問の再タイトル付けを検討したいと思います。 – Orangesandlemons

+0

server.close();動作しません。私は正しいコードで質問に更新しました。それは "b"で立ち往生し、コンソールでCtrl-Cを押すと続けられます。 – Ryan

答えて

2

を、あなたが言っていますポートでリッスンしているオブジェクトは、そのようにするのをやめます。

サーバーで新しい接続の受信を停止したい場合は、close methodを使用します。

var http = require("http"); 
var port = 3000; 
var serverUrl = "localhost"; 

var server = http.createServer(function(req, res) { 

    console.log("Request: " + req.url); 

    var now = new Date(); 
    var html = "<p>Hello World, the time is " + now + ".</p>"; 
    res.end(html); 
    server.close(); // <======================================= 
    // *** If you want to do something else at this point, call it from here *** 
}); 

console.log("Listening at " + serverUrl + ":" + port); 
server.listen(port, serverUrl); 

サーバーはすぐに終了しません。 http.Server#closeは、net.Server.closeと表示されます。

新しい接続を受け入れないようにサーバーを停止し、既存の接続を維持します。この関数は非同期で、すべての接続が終了してサーバーが'close'イベントを発行すると、最後にサーバーが閉じられます。オプションのcallbackは、'close'イベントが発生すると呼び出されます。このイベントとは異なり、サーバーが閉じられたときにサーバーが開いていない場合は、その唯一の引き数としてエラーが呼び出されます。

私のクイックローカルテストでは、しばらく時間がかかります。あなたは'connection'イベントas described in this answerを経由して接続を傍受し、サーバーを閉じるだけでなく、接続を破棄する場合は、それをより積極的にすることができます。

var http = require("http"); 
var port = 3000; 
var serverUrl = "localhost"; 

var connections = []; 
var server = http.createServer(function(req, res) { 

    console.log("Request: " + req.url); 

    var now = new Date(); 
    var html = "<p>Hello World, the time is " + now + ".</p>"; 
    res.end(html); 
    connections.forEach(function(con) { // *** 
     con.destroy();     // *** 
    });         // *** 
    server.close();      // *** 
    // *** If you want to do something else at this point, call it from here *** 
}); 
server.on("connection", function(con) { // *** 
    connections.push(con);    // *** 
});          // *** 

console.log("Listening at " + serverUrl + ":" + port); 
server.listen(port, serverUrl); 
+0

私は質問を更新しました。私は間違ったコードを最初に付けました(申し訳ありません)。 server.close();私はそれがほしいと思う方法を働かせません。それは "b"で立ち往生します – Ryan

+0

@ Ryan:サーバを閉じた後で何か他のことをしたいのであれば、それを行うためのコードを含める必要があります。例えば、おそらくあなたの 'dataHandler'関数を呼び出すか、関数内に' consumer'材料をラップして呼び出してください。あなたは**あなたが次に何をしたいのか言っていないので、私たちはあなたを正確に助けることはできませんが、それはあなたがすることです。私はあなたがそれをどこで行うのかを上記で指摘しました。 –

+0

カフカからのデータ取得を続けてほしい – Ryan

0

あなたはserver.close()を呼び出すことにより、リスニングからサーバーを停止することができます。

関連する問題