【问题标题】:Admin SDK update returning code 5: no entity to updateAdmin SDK 更新返回代码 5:没有要更新的实体
【发布时间】:2020-09-11 15:05:56
【问题描述】:

我正在尝试更新 Firestore 中的现有文档。该文件肯定存在。从客户端发送的数据包含文档本身的所有数据(每个字段和值以及由 firestore 自动生成的文档 ID)。

我已经尝试过传递给 Firebase 函数的每个数据值:data.id (auto-gen id)、data.emaildata.name,以创建对要更新的文档的引用,但仍然得到错误响应。但是,每次函数触发时,.then 和 .catch 块都会被执行。

正如我之前所说,该文档存在于数据库中的“用户”集合中。如何从管理 SDK 中引用它?

这里是被调用的函数:

exports.createAssetMux = functions.https.onCall((data, context) => {

    admin.firestore().collection('users').doc(data.id).update({
        streamID: '98273498237'
    }).then(
        console.log('update success')
    ).catch(error => {
        console.log('error message: ', error)
    });
});

这是我在终端中收到的错误消息:

error message:  Error: 5 NOT_FOUND: no entity to update: app: "dev~firebase-app"
path <
  Element {
    type: "users"
    name: "kPuVNXsFFIyhs3Qad06B"
  }
>

  code: 5,
  details: 'no entity to update: app: "firebase-app"\n' +
    'path <\n' +
    '  Element {\n' +
    '    type: "users"\n' +
    '    name: "kPuVNXsFFIyhs3Qad06B"\n' +
    '  }\n' +
    '>\n',
  metadata: Metadata {
    internalRepr: Map(1) { 'content-type' => [Array] },
    options: {}
  }
}

【问题讨论】:

  • 我已经编辑了我的原始帖子以包含来自终端的错误消息。目前使用模拟器在本地运行。
  • 看起来你有一些配置错误的东西“dev~live-from-868ea”看起来不像一个正确的应用程序 ID,我也不确定你是否编辑了错误代码,但 my-firestore 没有'看起来无效。您是否尝试编写具有相同功能的文档来验证您是否确实在访问您的数据库?我可以看到您还在不同的 cmets 上提出了一堆不同的问题,这不是使案例尽可能集中和简洁的好方法。请阅读How To ask 文档。
  • 是的,我是在漫长的一天之后发帖的,目的是要编辑他们两个。我的错。无论如何,配置应用程序 ID 的正确方法是什么?还是在开发模式下始终是该应用程序ID?我很确定我需要摆脱 ~dev 部分,只是不知道怎么做。我尝试使用相同的函数编写,它会命中 .then() 块并以成功消息响应,但在 db 中没有创建任何内容。
  • 好的,让我们分部分调试。总体概念是拥有一个写入 Firebase Firestore 数据库的云函数,对吗?您此时是否能够部署云功能并与您的数据库进行交互?即关注quickstart
  • 我能够部署该功能。它以 200 状态执行,但数据库中没有任何更新。但是,是的,这是正确的,这就是我要在这里提出的总体概念。谢谢!非常感谢您的帮助。

标签: javascript firebase google-cloud-firestore google-cloud-functions firebase-admin


【解决方案1】:

documentation 中所述,您需要返回一个promise,该promise 使用您要发送回客户端的数据进行解析。如果你开始一些异步工作而不处理承诺(update() 返回一个承诺),那么函数将关闭并且工作不会完成。

    return admin.firestore().collection('users').doc(data.id).update({
        streamID: '98273498237'
    }).then(
        console.log('update success')
        return { your: "response" }
    ).catch(error => {
        console.log('error message: ', error)
        return { your: "error" }
    });

您应该返回对您的客户端应用有意义的响应。

为了编写有效的云函数,您肯定需要了解 JavaScript 承诺的工作原理。

【讨论】:

  • 好的。我已经用 return 语句更新了我的函数,我同意,我将确保继续编写更好的代码并更多地理解这一点。但这不是这里的功能的问题。问题是文档引用路径,由于某种原因它没有引用正确的路径并且空手而归。
【解决方案2】:

哎呀,如果有一个类似于 eslint-plugin-promise 检查嵌套承诺的方式的 eslint 插件来检查未返回的承诺(或代码路径未能调用 response.send() ),那就太好了

比运行时错误更好地得到一个 lint 错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多