NodeJS模块——填充数组变为空对象。为什么?

3

我有一个模块导出了一个配置对象:

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 下面,它将保持填充状态,但这不是一个理想的解决方案。
我在这里确认了它不是ECMAScript bug和我的对象结构问题,因为它按预期工作。
我正在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文件。 - Bart
你确定这不只是一个显示错误吗?你真的尝试过使用索引,比如...foo[1]吗?这是你实际的数据还是在发布前进行了任何更改? - user1106925
...而且你说你可以将“fields”移动到更高的命名空间,它会起作用...但你正在询问“foo”... - user1106925
...默认的深度限制是2,所以正如我在之前的几个评论中建议的那样,这可能是一个显示问题。要查看完整深度的数据,请使用util.inspect()console.log(util.inspect(conf.music.catalog.mysql.requiredFields, {depth: null})); - user1106925
它标记了我的 fields.length === 0 异常,当我尝试引用 fields[0] 时,它是 undefined - Maverick
另外,我只创建了 foo 来排除名称 fields 是罪魁祸首的可能性。在更高的命名空间级别上,任何一个数组都可以使用。 - Maverick
1个回答

2
我可以重现使用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') - 改变克隆深度为我解决了这个问题。谢谢! - Maverick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接