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)))
我知道 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)))