NodeJS 模块 - 填充数组变成空对象。为啥?
Posted
技术标签:
【中文标题】NodeJS 模块 - 填充数组变成空对象。为啥?【英文标题】:NodeJS module - populated arrays turning into empty objects. Why?NodeJS 模块 - 填充数组变成空对象。为什么? 【发布时间】:2013-04-05 16:01:58 【问题描述】:我有一个导出配置对象的模块:
module.exports =
music :
catalog :
mysql :
requiredFields :
foo : [1,2,3],
trackQuery : [
table : 'tracks',
alias : 't',
foo : [1,2,3],
fields : [
'id',
'name',
'duration'
]
,
table : 'artists',
alias : 'a',
fields : [
'id',
'name'
]
]
fields
数组在运行时会变成空对象。
我这样确认:
var conf = require('musicConfig');
console.log ("requiredFields = %j", conf.music.catalog.mysql.requiredFields);
...输出这个:
requiredFields = ["foo":[1,2,3],"trackQuery":["table":"tracks","alias":"t","foo":,"fields":,"table":"artists","alias":"a","fields":]]
如你所见:
conf.music.catalog.mysql.requiredFields.foo // [1,2,3]
conf.music.catalog.mysql.requiredFields.trackQuery[0].foo // <-- WTF
conf.music.catalog.mysql.requiredFields.trackQuery[0].table // "tracks"
知道发生了什么吗?是的,我可以将 fields
数组移动到更高级别的命名空间,它会起作用——实际上是向前迈了一步。如果我将它直接放在requiredFields
下,它将保持填充状态,但这不是一个理想的解决方案。
我已经confirmed here 说这不是 ECMAScript 错误,也不是我的对象结构,因为它按预期工作。
我在 Ubuntu 上运行 Node 0.10.3,具有以下依赖项:
"dependencies" :
"express" : "3.1.0",
"redis" : "0.8.2",
"jade" : "0.28.2",
"mysql" : "2.0.0-alpha7",
"mongodb" : "*",
"config" : "0.4.22"
我认为可能是config module,但即使我绕过它,问题仍然存在。
更新
这是来自console.log(util.inspect(config.music.catalog.mysql.requiredFields.trackQuery[0], showHidden: true, depth: null ));
的输出——尽管它并没有太大帮助。我正在寻找更多有用的标志,欢迎提出建议。
table: [Getter/Setter],
alias: [Getter/Setter],
foo: [Getter/Setter],
fields: [Getter/Setter],
[__watchers]:
table:
[ [Function]
[length]: 0,
[name]: '',
[arguments]: null,
[caller]: null,
[prototype]: [constructor]: [Circular] ,
[length]: 1 ],
alias:
[ [Function]
[length]: 0,
[name]: '',
[arguments]: null,
[caller]: null,
[prototype]: [constructor]: [Circular] ,
[length]: 1 ],
foo:
[ [Function]
[length]: 0,
[name]: '',
[arguments]: null,
[caller]: null,
[prototype]: [constructor]: [Circular] ,
[length]: 1 ],
fields:
[ [Function]
[length]: 0,
[name]: '',
[arguments]: null,
[caller]: null,
[prototype]: [constructor]: [Circular] ,
[length]: 1 ] ,
[__propertyValues]:
table: [ 'tracks', [length]: 1 ],
alias: [ 't', [length]: 1 ],
foo: [ [__watchers]: , [__propertyValues]: , [length]: 1 ],
fields: [ [__watchers]: , [__propertyValues]: , [length]: 1 ]
【问题讨论】:
你可以在 node.js 中 require() 纯 json 文件 你确定这不仅仅是一个显示错误?您是否真的尝试过索引,例如...foo[1]
?这是您的实际数据,还是您在发布之前以任何方式对其进行了更改?
...您说您可以将fields
移动到更高的命名空间,它会起作用...但您问的是foo
...
...默认深度限制默认为2
,所以正如我建议的那样,这可能是显示问题。要全面查看数据,请使用util.inspect()
:console.log(util.inspect(conf.music.catalog.mysql.requiredFields, depth: null));
它标记了我的fields.length === 0
异常,当我尝试引用fields[0]
时它是undefined
【参考方案1】:
我可以在使用config
模块读取文件时重现问题,所以我认为您没有正确绕过它。
另外,当我在config/lib/config.js
中增加DEFAULT_CLONE_DEPTH
时(它似乎不能从外部配置,但我不是很熟悉),它可以工作:
> console.log(conf.music.catalog.mysql.requiredFields.trackQuery[0].foo)
[ [Getter/Setter], [Getter/Setter], [Getter/Setter] ]
【讨论】:
我已经通过require('./config/default.js')
绕过它(所以我想) - 更改克隆深度为我解决了这个问题。谢谢!!以上是关于NodeJS 模块 - 填充数组变成空对象。为啥?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 mongoosastic 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象
为啥 mongoosastic 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象