2014-08-02 6 views
2

У меня проблема с моим кодом ниже, где моя переменная 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 сразу, на который ответят связанные вопросы.

+0

Я попробовал добавить 'server = null;' после 'server.close()', чтобы убедиться, что новый сервер не будет иметь никаких проблем. Даже если старый сервер все еще где-то плыл в памяти, почему он заставит новый сервер использовать старую конфигурацию? – Nathan

+0

Вы уверены, что сервер использует старые конфигурации. Возможно, тесты, которые вы используете, связаны с некоторыми непригодными портами. Вы не можете создать сервер через каждый другой порт, поскольку некоторые порты уже используются. Так что сделайте интеллектуальные тесты. Напр. 3000, за которым следуют 5000 и 5001, работает для меня и приходит к выводу. И старые серверы начали действительно закрываться в течение некоторого времени (после закрытия их соединений) – ma08

+1

Код работает при повторном использовании одного и того же порта каждый раз, еще одно указание на то, что не работает несколько серверов. Я думаю, что проблема - проблема. Я думаю, что как-то исходная конфигурация закрывается в обратном вызове, переданном http.createServer, и по какой-то причине она просто не изменится. – anderspitman

Смежные вопросы