在 Firestore 上的 Document (NodeJS) 中设置 DocumentReference

Posted

技术标签:

【中文标题】在 Firestore 上的 Document (NodeJS) 中设置 DocumentReference【英文标题】:Setting a DocumentReference in Document on Firestore (NodeJS) 【发布时间】:2018-03-15 20:49:29 【问题描述】:

我正在尝试使用 NodeJS v8.6.0 创建一个包含 Firestore 参考的文档。像这样

const admin = require('firebase-admin')
admin.initializeApp( credential: MY_CREDENTIAL, databaseURL: MY_DB_URL )
const db = admin.firestore()

const ref = db.doc('foo/someDoc')
db.doc('bar/targetDoc').set( link: ref )

虽然refDocumentReference,但它的结果

错误:参数“数据”不是有效的文档。输入对象更深 超过20个级别或包含一个循环。

有没有办法在 NodeJS (Admin)SDK 上做呢?


另外,代码中使用的包是

"firebase-admin": "^5.4.1"

console.log(ref)

输出

DocumentReference 
  _firestore: 
   Firestore 
     makeAuthenticatedRequest: 
       [Function: makeAuthenticatedRequest]
        getCredentials: [Function: bound getCredentials],
        authClient: [Object] ,
     authClient: 
      Auth 
        authClientPromise: null,
        authClient: null,
        config: [Object],
        environment:  ,
     baseUrl: undefined,
     getCredentials: [Function: bound getCredentials],
     globalInterceptors: [],
     interceptors: [],
     packageJson: 
       name: '@google-cloud/firestore',
        version: '0.8.1',
        author: 'Google Inc.',
        description: 'Firestore Client Library for Node.js',
        contributors: [Array],
        main: './src/index.js',
        files: [Array],
        repository: 'googleapis/nodejs-firestore',
        keywords: [Array],
        dependencies: [Object],
        devDependencies: [Object],
        scripts: [Object],
        license: 'Apache-2.0',
        engines: [Object],
        types: './types/firestore.d.ts' ,
     projectId: 'MY_PROJECT',
     projectIdRequired: true,
     Promise: [Function: Promise],
     grpcMetadata: Metadata  _internal_repr: [Object] ,
     maxRetries: undefined,
     userAgent: 'gcloud-node-firestore/0.8.1',
     activeServiceMap_: Map ,
     protos: ,
     _preferTransactions: false,
     _lastSuccessfulRequest: null,
     api:  Firestore: [Object] ,
     _referencePath: 
      ResourcePath 
        segments: [],
        _formattedName: undefined,
        _projectId: 'dewpod-dev',
        _databaseId: '(default)' ,
     app: 
      FirebaseApp 
        firebaseInternals_: [Object],
        services_: [Object],
        isDeleted_: false,
        name_: '[DEFAULT]',
        options_: [Object],
        database: [Function: bound ],
        auth: [Function: bound ],
        messaging: [Function: bound ],
        storage: [Function: bound ],
        firestore: [Function: bound ],
        INTERNAL: [Object] ,
     INTERNAL: FirestoreInternals  ,
  _referencePath: 
   ResourcePath 
     segments: [ 'orgs', 'fooOrg' ],
     _formattedName: undefined,
     _projectId: 'dewpod-dev',
     _databaseId: '(default)'  

完整的错误信息是

/SOME_PATH/node_modules/@google-cloud/firestore/src/validate.js:86
        throw new Error(message);
        ^

Error: Argument "data" is not a valid Document. Input object is deeper than 20 levels or contains a cycle.
    at Object.exports.(anonymous function) [as isDocument] (/SOME_PATH/node_modules/@google-cloud/firestore/src/validate.js:86:15)
    at WriteBatch.set (/SOME_PATH/node_modules/@google-cloud/firestore/src/write-batch.js:251:14)
    at DocumentReference.set (/SOME_PATH/node_modules/@google-cloud/firestore/src/reference.js:416:8)
    at Object.<anonymous> (/SOME_PATH/fstest.js:17:20)
    at Module._compile (module.js:624:30)
    at Object.Module._extensions..js (module.js:635:10)
    at Module.load (module.js:545:32)
    at tryModuleLoad (module.js:508:12)
    at Function.Module._load (module.js:500:3)
    at Function.Module.runMain (module.js:665:10)

【问题讨论】:

@NovoLucas 似乎样本没有保存任何参考。你能指出它在哪里吗? 这应该可以工作,所以这可能是一个依赖问题,以至于DocumentReference 无法通过set 中的instanceof 检查。你是如何导入firestore的?你确定你只导入一次吗?你能console.log(ref);另外,你使用的是哪个版本的节点? @GilGilbert 编辑了这篇文章。请检查。而且,是的,我可以用 NodeJS v8.6.0 用最少的代码重现它。 “require('firebase-admin')”一次,“admin.initializeApp”一次。 谢谢。我们已经能够重现这一点。这是管理 SDK 和常规节点 SDK 之间交互的错误。这可以通过常规 node.js SDK 工作,您可以按此处所述获得:cloud.google.com/nodejs/docs/reference/firestore/0.8.x 谢谢吉尔。期待补丁:) 【参考方案1】:

这是管理员 SDK 和 Firestore 的常规节点 SDK 之间交互的错误。

@google-cloud/firestore 0.8.2 的更新应该可以解决这个问题。

您可以使用 npm update 更新您的项目以获取此更改。

【讨论】:

【参考方案2】:

我在实现后台函数来处理文档更新事件时遇到了类似的错误。与docs suggest 一样,重要的是通过检查您是否不会无意中重新触发相同的函数来避免无限循环:

每当您写入触发函数的同一个文档时,您都有创建无限循环的风险。谨慎使用,确保在不需要更改时安全退出函数

还有来自here:

注意:请注意避免函数的结果实际上会重新触发函数,从而创建无限循环的任何情况 - 例如,通过写入特定 Cloud Firestore 文档触发的函数会通过写入同一路径而终止。还要确保以幂等的方式编写函数,以便它们在为单个事件运行多次时产生相同的结果。

【讨论】:

以上是关于在 Firestore 上的 Document (NodeJS) 中设置 DocumentReference的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firestore QuerySnapshot 没有 getter 'document 的实例

尝试将使用 [react-native-document-picker] 选择的文件上传到 fireStore 存储时出现权限拒绝错误

Firestore 聊天应用程序 - 构建消息主页

Android 上的 Firestore 商店缓存在哪里?

Firestore 更新使应用程序崩溃

从 firestore.DocumentReference 获取路径