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 错误,也不是我的对象结构,因为它按预期工作。

我在 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"
}

我认为可能是那个配置模块,但即使我绕过它,问题仍然存在。

更新

这是来自: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 ] } }
4

1 回答 1

2

我可以在使用模块读取文件时重现问题config,所以我认为您没有正确绕过它。

此外,当我增加DEFAULT_CLONE_DEPTHconfig/lib/config.js(它似乎无法从外部配置,但我对它不是很熟悉),它可以工作:

> console.log(conf.music.catalog.mysql.requiredFields.trackQuery[0].foo)
[ [Getter/Setter], [Getter/Setter], [Getter/Setter] ]
于 2013-04-13T06:16:13.293 回答