为什么我的变量不更新?

时间:2014-08-02 18:54:16

标签: javascript node.js

我的代码出现问题,我的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);
}

1 个答案:

答案 0 :(得分:1)

您的问题出在server.close。查看this questionthis one

  

server.close()

     

但是,这只会阻止服务器接收任何新的http连接。它不会关闭任何仍然打开的。 http.close()接受回调,并且在所有打开的连接实际断开之前,该回调不会执行。有没有办法强制关闭一切?

正在发生的事情是您可能正在创建多个服务器,因为尚未断开连接。我不认为变量没有变化。我已经测试了您的代码,并且在更改文件时会创建多个服务器(在不同的端口上)。因此,您真正的问题是要立即正常关闭http服务器,这会在链接的问题中得到解答。