【发布时间】: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 })
虽然ref 是DocumentReference,但它的结果
错误:参数“数据”不是有效的文档。输入对象更深 超过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
-
谢谢吉尔。期待补丁:)
标签: node.js firebase google-cloud-firestore