如何在Node.js中退出函数

时间:2017-04-06 15:30:29

标签: javascript node.js apache-kafka

我希望程序停止侦听请求,并在成功加载页面一次后继续使用代码。我已经尝试在函数的代码末尾添加break;,但它说这是非法的中断。我不知道应该使用什么而不是休息。

我应该如何让它退出该功能?

提前致谢。

我使用this site中的以下代码与Node.js:

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

2 个答案:

答案 0 :(得分:2)

退出某个功能(可能是return,而不是break),您正在告诉正在侦听的对象港口停止这样做。

如果您希望服务器停止侦听新连接,请使用其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'。与该事件不同,如果服务器在关闭时未打开,则会调用Error作为唯一参数。

在我的快速本地测试中,需要一段时间。如果您通过'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);

答案 1 :(得分:0)

您可以通过拨打server.close()来停止服务器的监听。