我正在使用Node JS应用程序,使用Coffeescript和Mongoose以及MongoDB数据库。
我有一个像这样的Mongoose模型:
Client = mongoose.model 'Client', mongoose.Schema
# Basics
name: String
email: String
api_key: String
# Modules enabled / disabled
modules: Object
# Settings for modules
reporting: Object
filter: Object
templates: Object
datatypes: Object
modules属性是一个包含键的对象,其中一个布尔值指示是否应该加载一个模块(请参阅本文中的console.log输出)。下面的四个属性是特定模块的设置。
当我的应用程序启动时,我会为当前用户加载此信息,并将数据分配给配置变量,如下所示:
config.name = clients[0].name
config.api_key = clients[0].api_key
config.modules =
reporting_enabled: clients[0].modules.reporting
filter_enabled: clients[0].modules.filter
templates_enabled: clients[0].modules.templates
datatypes_enabled: clients[0].modules.datatypes
现在前三个模块完美运行。我在一周前对它们进行了编码,没有任何问题。但我现在正在添加数据类型模块,而且我遇到了一个非常奇怪的问题。
每当我尝试访问clients[0].datatypes
属性时,它都会返回undefined
,但当我console.log clients[0]
时,它会显示所有属性及其值,包括数据类型。
console.log clients[0]
的部分输出:
modules:
{ datatypes: true,
templates: true,
filter: false,
reporting: true },
reporting:
{ email_interval: 2,
name: '___',
email: '___',
send_email: true },
filter: {},
templates: { cms: { contacts: [Object] } },
datatypes: { cms: { contacts: [Object] } }
如您所见,所有属性都包括数据类型。其中我可以毫无问题地访问模块,报告,过滤器和模板属性(例如使用clients[0].modules
),但是当我想访问数据类型属性clients[0].datatypes
时,它将返回undefined
我已经三次检查我是否正在编写数据类型'正确地说,它不是一个与我混淆的异步功能。我把日志放在我实际想要使用.datatypes的行的前面,并且那时没有异步的东西,所以它不是。我尝试了其他一些东西,改变了加载顺序等,但没有任何作用。
console.log clients[0]
console.log clients[0].datatypes
第一行输出我的整个对象,包括datatypes属性。第二个一直在说undefined
。
我认为这可能与Node或Mongoose有关,或者它是Javascript怪癖中的一个,或者也许(同样可能)它只是我是一个白痴并弄乱了一些东西。我真的不知道,我现在一直在寻找解决方案大约两个小时,做了一百次谷歌搜索,挖掘了StackOverflow和其他网站,但我找不到回答我的问题而无法自己解决问题。这里有人知道可能导致这个问题的原因吗?
答案 0 :(得分:1)
对于遇到此问题的其他人,我的解决方法是在Mongoose结果上调用.toObject()
:client[0] = client[0].toObject()
。这会将Mongoose对象转换为常规对象。
对我来说,如果没有这个可以解决所有其他属性的原因仍然有点神秘,但是那个属性不会。但.toObject()
为我解决了这个问题。