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 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象

NodeJS 和 Mongoose:将元素添加到现有的空数组

如何用空对象填充字符串数组?

为啥我的 JSON 数组会变成一个对象?

jQuery 1.4.4+ AJAX 请求 - 发布空数组或对象变成字符串