NodeJS缓存问题

时间:2015-01-27 20:19:01

标签: node.js caching express configuration

我知道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/,那么它会正确获取default.js文件。如果我尝试访问http://website.com/test,那么它会再次正确获取test.js文件。但是现在如果我再次尝试访问http://website.com/,它仍会显示test.js文件!不知道这里发生了什么。我甚至试过console.log(siteConfigPath)并且每次都显示正确文件的路径。

更有趣的是,如果我访问http://website.com/test然后访问http://website.com/testing之类的其他网址,则会始终返回正确的文件。它只是显示缓存结果的http://website.com/网址。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

问题在于:

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

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

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

siteDefaultConfig = _.clone(require(siteDefaultConfigPath))

但是,如果您有嵌套对象,可以尝试这种方法:

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