【问题标题】:Node JS Inspect shows property has value but inspecting property returns undefinedNode JS Inspect 显示属性具有值但检查属性返回未定义
【发布时间】:2015-10-20 18:39:24
【问题描述】:

我正在开发一个 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

第一行输出我的整个对象,包括数据类型属性。第二个一直说undefined

我认为这可能与 Node 或 Mongoose 有关,或者它是那些 Javascript 怪癖之一,或者也许(很可能)只是我是个白痴并搞砸了一些事情。我真的不知道,我已经搜索了大约两个小时的解决方案,做了一百次谷歌搜索,通过 StackOverflow 和其他网站进行挖掘,但我找不到我的问题的答案并且无法不要自己修。这里有人知道可能导致此问题的原因吗?

【问题讨论】:

  • 没有运行可能影响clients 数组的异步函数。有一个 Mongoose .find 获取客户端数据,这段代码在它的回调函数中。我使用clients 中的各种属性没有任何问题,在我放置console.log 位之前和之后。此外,通过实时参考,您是否意味着打印到终端的值会随着客户端 [0] 的变化而更新?因为我从未见过这种情况发生?顺便说一句,我不是在谈论浏览器 Javascript 调试器窗口,这是我在 Mac 上的终端中运行的 Node 应用程序。
  • 如果是这种情况,我该怎么做?我不认为是这样,我通过 Mongolab 在线界面添加了属性,就像其他数据一样,只有一个属性会导致问题。
  • 我尝试了更多的东西,我终于通过在收到的 Mongoose 对象上调用 .toObject() 来让它工作。我不明白为什么其他属性没有它就可以完美运行而这个不会,但我确实设法解决了这个问题。 @muistooshort 感谢您的帮助:)

标签: javascript node.js mongodb mongoose coffeescript


【解决方案1】:

对于遇到此问题的其他人,我的解决方法是在 Mongoose 结果上调用 .toObject()client[0] = client[0].toObject()。这会将 Mongoose 对象转换为常规对象。

对我来说,为什么所有其他属性都可以在没有这个的情况下很好地处理,但一个属性却不能,这仍然是一个谜。但是.toObject() 为我解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2017-06-08
    • 2018-07-24
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多