dexie 的返回值有资格作为对象,但它不是

Posted

技术标签:

【中文标题】dexie 的返回值有资格作为对象,但它不是【英文标题】:Returned value from dexie qualifies as object, but then it isn't 【发布时间】:2021-12-30 04:36:36 【问题描述】:

我用 dexie.js 创建了一个对象存储,并用这样的空对象填充它:

db.version(1).stores(
  status: 'id, settings' // only one entry, no need to auto-increment
)
// Add initial data
db.on("populate", () => 
    db.status.add(
        id: 0,
        settings: 
    )
)

稍后,Nuxt 2 将使用来自服务器的数据填充“设置”。但是,我需要检查每条路由,如果 settings 对象首先包含值,然后再启动对数据库的调用。因此,我得到了“状态”对象库并检查了dbStatusSettings instanceof Object。当“单独”完成时,这评估为真;但在“if”条件的上下文中,会返回错误:

// default.vue
async checkIfSettingsExist() 
  const dbStatus = await db.status.get(0);
  const dbStatusSettings = await dbStatus.settings

  // this returns true
  console.log(dbStatusSettings instanceof Object)

  // however, here I get the error message (see below)
  if ((dbStatusSettings instanceof Object) && Object.keys(dbStatusSettings.keys).length > 0) 
    // Found data in indexddb's "status.settings", so save it to VueX
    this.$store.commit('status/updateSettings', dbStatusSettings)

    // Leave function
    return;
  

这是返回的错误信息:

default.vue?ec86:190 Uncaught (in promise) TypeError: Cannot convert undefined or null to object

第 86 行指的是async checkIfSettingsExist()

我不明白,为什么 JS 刚刚证明自己可以处理一个对象,却突然抱怨将“未定义”转换为对象。

我在这里误解了什么?我的错误是什么?

【问题讨论】:

【参考方案1】:

再次发生,发布后最多只需要半个小时,我自己发现了错误。

这个:Object.keys(dbStatusSettings.keys).length 当然应该是 这个:Object.keys(dbStatusSettings).length

我很惭愧,但我还是把这篇文章留了下来以备将来参考。

【讨论】:

以上是关于dexie 的返回值有资格作为对象,但它不是的主要内容,如果未能解决你的问题,请参考以下文章

String 的compare比较方法返回值有啥含义

类值返回未定义,因为值有可能改变

“编程”里的返回值是啥意思?

javaScript中的setTimeout返回值有啥用?

为啥 Dexie 在 transaction() 中 modify() 后返回旧数据?

VB的Shell返回值到底有啥用?仅仅是为了返回执行是不是成功吗?