0
votes

Supprimer des champs d'un document Firestore à l'aide de nodejs

J'essaie de supprimer des champs d'un document Firestore sans succès.

J'ai recherché les messages d'erreur que je reçois, mais les quelques pages que je peux trouver un lien vers des choses que je fais déjà. Je suis sûr que c'est quelque chose de simple mais je suis perdu pour le moment.

Error: Update() requires either a single JavaScript object or an alternating list of field/value pairs that can be followed by an optional precondition. Argument "dataOrField" is not a valid Document. Couldn't serialize object of type "DeleteTransform". Firestore doesn't support JavaScript objects with custom prototypes (i.e. objects that were created via the 'new' operator).
    at WriteBatch.update (XXXXXXXXXX\node_modules\@google-cloud\firestore\build\src\write-batch.js:359:23)
    at DocumentReference.update (XXXXXXXXXX\node_modules\@google-cloud\firestore\build\src\reference.js:387:14)
    at Object.<anonymous> (XXXXXXXXXX)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:191:16)

Je m'attends à ce que le champ soit supprimé mais j'obtiens à la place ce message d'erreur:

const Firestore = require('@google-cloud/firestore');
const admin = require('firebase-admin');
const FieldValue = admin.firestore.FieldValue;

const firestore = new Firestore({
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
});
const settings = {timestampsInSnapshots: true};
firestore.settings(settings);


var updateDoc = firestore.collection('XXXXXXXX').doc('XXXXXXX').update({
    fieldToBeDeleted: FieldValue.delete()
}); 


2 commentaires

Il semble que vous mélangez l'utilisation du SDK Firebase Admin et du SDK Cloud. Essayez d'utiliser les symboles de l'un ou de l'autre, et non des deux à la fois. Vous utilisez Firestore partir du SDK Cloud, mais FieldValue.delete() partir du SDK d'administration.


Cela l'a fait Doug. Merci pour l'aide. J'ai supprimé les 2 lignes de trucs du SDK d'administration du haut et changé la ligne de suppression en "fieldToBeDeleted: Firestore.FieldValue.delete ()"


3 Réponses :


3
votes

Apparemment, vous ne pouvez pas mélanger les symboles entre le SDK Cloud et le SDK Firebase Admin (qui encapsule le SDK Cloud). Firebase exporte ses propres symboles, qui ne peuvent pas être utilisés avec les appels qui vont directement au SDK Cloud. Les appelants sont obligés d'utiliser l'un ou l'autre, mais pas les deux en même temps.

ÉDITER:

Voici le code qui a fini par fonctionner, en utilisant uniquement le SDK Cloud, sans le SDK Firebase Admin.

const Firestore = require('@google-cloud/firestore');

const firestore = new Firestore({
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
});
const settings = {timestampsInSnapshots: true};
firestore.settings(settings);


var updateDoc = firestore.collection('XXXXXXXX').doc('XXXXXXX').update({
    fieldToBeDeleted: Firestore.FieldValue.delete()
}); 


0 commentaires

0
votes

J'ai eu un problème similaire dans Cloud Functions avec un lot d'écriture. Au départ, j'étais autorisé à utiliser docRef = admin.firestore (). Collection ('XXXXXXX'). Doc ('XXXXXX') avec FieldValue.delete () à partir du SDK Cloud.

Ce n'est que récemment que j'ai commencé à avoir une erreur dans mon code, et je ne savais pas quel était mon problème (car je n'ai pas changé cette partie du code) jusqu'à ce que je tombe sur cette question et la réponse de Doug. Quoi qu'il en soit, j'ai abordé la solution un peu différemment (mais toujours conforme à la recommandation de Doug) et je suis allé uniquement avec le SDK Admin.

import * as admin from 'firebase-admin';

const firestoreInstance = admin.firestore();
const fieldValue = admin.firestore.FieldValue;
const docRef = firestoreInstance.collection('XXXXXXX').doc('XXXXXXX');
const batch = firestoreInstance.batch();

...

batch.update(docRef, { fieldToBeDeleted: fieldValue.delete() });

return batch.commit();


0 commentaires

0
votes

J'ai eu aujourd'hui une erreur similaire et il s'est avéré être un problème de non-concordance de version. Mon application avait une bibliothèque qui importait firebase-admin , mais une ancienne version de celle-ci. Le FieldValue.delete été importé de la version la plus récente et enregistré par un code qui importait l'ancienne version de firebase-admin . C'est pourquoi le symbole n'a pas été reconnu.


0 commentaires