Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting a DocumentReference in Document on Firestore (NodeJS)

I am trying to create a doc with a reference on Firestore with NodeJS v8.6.0. Like this

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 })

Although ref is a DocumentReference, it results

Error: Argument "data" is not a valid Document. Input object is deeper than 20 levels or contains a cycle.

Is there anyway to do it on NodeJS (Admin)SDK?


In addition, the package used in the code is

"firebase-admin": "^5.4.1"

and

console.log(ref)

outputs

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)' } }

and the full error message is

/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)
like image 932
Ray Sakai Avatar asked Oct 04 '17 12:10

Ray Sakai


People also ask

How do I add a field to an existing document in firestore?

Build a DocumentReference to the document you want to update, then use the update() method on the DocumentReference to indicate only the fields to be added or changed. Pass it an object with only properties that match the fields to add or change.

How do you create a reference for a document?

Citation includes author's name, year of publication, then page numbers if available. If your source lacks an author, cite the first one or two words of the title. If no date is given, place "n.d." after the author's name. note on page numbers: Web documents often don't have page numbers.

How do I change my firestore document ID?

Firestore Update Entire Document getDatabase() → where we want to update a document. doc() → where we'll be passing references of database, collection and ID of a document that we want to update. setDoc() → where we actually pass new data that we want to replace along with the doc() method.


1 Answers

This was a bug in an interaction between the admin SDK and the regular node SDK for Firestore.

An update to @google-cloud/firestore 0.8.2 should fix this issue.

You can update your project with npm update to get this change.

like image 124
Gil Gilbert Avatar answered Sep 23 '22 16:09

Gil Gilbert