我知道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/网址。
感谢任何帮助。
答案 0 :(得分:1)
问题在于:
siteDefaultConfig = require(siteDefaultConfigPath);
siteConfig = _.extend(_.clone(siteDefaultConfig), siteConfig);
您永久地扩展了从require(siteDefaultConfigPath)返回的对象,因此在后续请求中,该对象将不再是原始对象,而是返回扩展版本。
您需要克隆从require()返回的对象。你有几个选择,如果它是一个浅层对象(没有嵌套对象),你可以使用下划线的克隆方法:
siteDefaultConfig = _.clone(require(siteDefaultConfigPath))
但是,如果您有嵌套对象,可以尝试这种方法:
siteDefaultConfig = JSON.parse(JSON.stringify(require(siteDefaultConfigPath)))