NodeJS缓存问题

NodeJS Caching issue

我知道 Nodejs 缓存 required 个文件。

我创建了一个 sites 目录,专门用于存储配置文件。我想获取一个动态命名的配置文件。

router.get('/:site?', function(req, res, next) {

    var site = (req.params && req.params.site) || 'default';

    var env = process.env.NODE_ENV,
        vaildEnv = ['development', 'staging', 'production'];

    if(vaildEnv.indexOf(env) === -1) env = 'default';

    var curDir = __dirname,
        siteDefaultConfigPath = curDir + '/../sites/' + env + '/default.js',
        siteConfigPath = curDir + '/../sites/' + env + '/' + site + '.js',
        siteDefaultConfig, siteConfig;

    if(!fs.existsSync(siteConfigPath)) return next();

    siteConfig = require(siteConfigPath);

    if(site !== 'default') {
        if(fs.existsSync(siteDefaultConfigPath)) {
            siteDefaultConfig = require(siteDefaultConfigPath);
            siteConfig = _.extend(siteDefaultConfig, siteConfig);
        }
    }
}

现在,如果我再次尝试访问 http://website.com/ then it correctly fetches the default.js file. If I try accessing http://website.com/test then again it correctly fetches test.js file. But now if I try access http://website.com/,它仍然会显示 test.js 文件!不确定这里发生了什么。我什至尝试 console.log(siteConfigPath) 并且它每次都显示正确文件的路径。

更有趣的是,如果我访问显示缓存结果的 http://website.com/test and then and other URL like http://website.com/testing it always returns the correct file. It's only the http://website.com/ URL。

感谢任何帮助。

问题是这样的:

siteDefaultConfig = require(siteDefaultConfigPath);
siteConfig = _.extend(_.clone(siteDefaultConfig), siteConfig);

您正在永久扩展从 require(siteDefaultConfigPath) returned 的对象,因此在后续请求中,该对象将不再是原始对象,而是 return 扩展版本。

您需要从 require() return 克隆对象。你有几个选择,如果它是一个浅对象(没有嵌套对象)你可以使用下划线的克隆方法:

siteDefaultConfig = _.clone(require(siteDefaultConfigPath))

但是如果你有嵌套对象,你可以试试这个方法:

siteDefaultConfig = JSON.parse(JSON.stringify(require(siteDefaultConfigPath)))