2016-12-16 58 views
0

我寫的NodeJS如下的簡單和工作的Web服務器上的文件發生更改時重新啓動Web服務器:配置使用的NodeJS

var http = require("http"); 
var fs = require("fs"); 

console.log("Web server started"); 
var config = JSON.parse(fs.readFileSync("./private/config.json")); 

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

    console.log("received request: " + req.url); 
    fs.readFile("./public" + req.url,function(error,data){ 

     if (error){ 

      // Not sure if this is a correct way to set the default page? 
      if (req.url === "/"){ 
       res.writeHead(200,{"content-type":"text/plain"}); 
       res.end("here goes index.html ?"); 
      } 

      res.writeHead(404,{"content-type":"text/plain"}); 
      res.end(`Sorry the page was not found.\n URL Request: ${req.url}`); 
     } else { 
      res.writeHead(200,{"content-type":"text/plain"}); 
      res.end(data); 
     } 

    }); 
}); 

現在,我想我的Web服務器重新啓動,並聽取了新的端口時,端口號配置文件中的更改。所以我添加下面的代碼:

fs.watch("./private/config.json",function(){ 
    config = JSON.parse(fs.readFileSync("./private/config.json")) 
    server.close(); 
    server.listen(config.port,config.host,function(){ 
     console.log("Now listening: "+config.host+ ":" +config.port); 
    }); 
}); 

這工作得很好,當我改變配置文件中的端口,我可以訪問新的端口上我的Web服務器。但是,我也可以在以前的端口上訪問它。在我聽新端口之前,我以爲我正在關閉前一個端口上的Web服務器。我錯過了什麼?

我感謝你的幫助:)

+0

我的2美分,描述https://nodejs.org/api/net.html#net_server_close_callback,它停止接受新連接,並保持現有的連接。 –

+0

我認爲'keep-alive'導致服務器不關閉連接, –

+0

爲什麼不使用nodemon代替 – UchihaItachi

回答

0

由於穆克什·夏爾馬提到,Server.close()停止接受新的連接,並保持現有的連接。也就是說,服務器對於所有活動的套接字都保持打開狀態(直到它們由於活動時間而自然死掉),但是不會創建新的套接字。

我發現這個問題可以是this question

可能重複所以我接着戈洛羅登在鏈接中提到的建議解決方案和它的工作。基本上你需要記住打開的套接字連接並在關閉服務器之後銷燬它們。這是我修改後的代碼:

var http = require("http"); 
var fs = require("fs"); 

console.log("Web server started"); 
var config = JSON.parse(fs.readFileSync("./private/config.json")); 

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

    console.log("received request: " + req.url); 
    fs.readFile("./public" + req.url,function(error,data){ 

     if (error){ 

      // Not sure if this the correct method ? 
      if (req.url === "/"){ 
       res.writeHead(200,{"content-type":"text/plain"}); 
       res.end("welcome to main page"); 
      } 

      res.writeHead(404,{"content-type":"text/plain"}); 
      res.end(`Sorry the page was not found.\n URL Request: ${req.url}`); 
     } else { 
      res.writeHead(200,{"content-type":"text/plain"}); 
      res.end(data); 
     } 

    }); 
}); 

server.listen(config.port,config.host,function(){ 
    console.log("listening: "+config.host+ ":" +config.port); 
}); 

var sockets = {}, nextSocketId = 0; 
server.on('connection', function (socket) { 

    // Add a newly connected socket 
    var socketId = nextSocketId++; 
    sockets[socketId] = socket; 
    console.log('socket', socketId, 'opened'); 

    // Remove the socket when it closes 
    socket.on('close', function() { 
    console.log('socket', socketId, 'closed'); 
    delete sockets[socketId]; 
    }); 

}); 

fs.watch("./private/config.json",function(){ 
    config = JSON.parse(fs.readFileSync("./private/config.json")) 
    console.log('Config has changed!'); 
    server.close(function() { console.log('Server is closing!'); }); 

    for (var socketId in sockets) { 
     console.log('socket', socketId, 'destroyed'); 
     sockets[socketId].destroy(); 
    } 

    server.listen(config.port,config.host,function(){ 
    console.log("Now listening: "+config.host+ ":" +config.port); 
    }); 
}); 
+0

現在我有另一個問題,我試圖把套接字循環放入server.close()的回調函數,但它沒有工作。它不會產生任何錯誤,但它也不起作用。這是爲什麼 ? –