У меня проблема с моим кодом ниже, где моя переменная 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);
}
Похож на проблему с запуском нескольких серверов. Все на одном и том же порту. –