我的代码出现问题,我的config
变量在某些区域正在更新,但在http.createServer
内的功能中,它并未发生变化。我有一些意见,以表明下面的代码中发生了什么。我的猜测是配置被保留在某个地方,或者我不了解JavaScript范围以及我的想法。谁能解释一下这里发生了什么?
Connection: keep-alive
标头,服务器保持套接字打开。暂时(因为这是一个流量较低的本地服务器),我已添加res.setHeader('Connection','close');
,这似乎可以解决此问题,因为在配置更改后使用同一客户端在短时间内连接时
// global variables & configuration
var fs = require('fs');
var utils = require('./utils.js');
var configFile = 'config.json';
var initialConfig = JSON.parse(fs.readFileSync(configFile));
var server = {};
// watch file system for changes to configuration
fs.watchFile(configFile, function(curr, prev) {
console.log('config change detected');
// reload the configuration
var config = JSON.parse(fs.readFileSync(configFile)); // config is correct
if (typeof server !== 'undefined') {
server.close();
}
serveStatic(config);
});
// start the server
serveStatic(initialConfig);
// server functions
function serveStatic(config) {
var http = require('http'); // config is the new (correct) value
var startTime;
server = http.createServer(function(req, res) { // config is the old value, never changes
try {
// solution: res.setHeader('Connection','close');
res.end(JSON.stringify(config));
} catch (err) {
if (res.statusCode === 200)
res.statusCode = 500;
res.write(http.STATUS_CODES[res.statusCode]);
if (config.detailed_errors)
res.write('\n' + err);
res.end();
}
});
console.log('Starting server on port ' + config.port);
server.listen(config.port);
}
答案 0 :(得分:1)
您的问题出在server.close
。查看this question和this one
server.close()
但是,这只会阻止服务器接收任何新的http连接。它不会关闭任何仍然打开的。 http.close()接受回调,并且在所有打开的连接实际断开之前,该回调不会执行。有没有办法强制关闭一切?
正在发生的事情是您可能正在创建多个服务器,因为尚未断开连接。我不认为变量没有变化。我已经测试了您的代码,并且在更改文件时会创建多个服务器(在不同的端口上)。因此,您真正的问题是要立即正常关闭http服务器,这会在链接的问题中得到解答。