Как обновить DocumentReference? - PullRequest
       16

Как обновить DocumentReference?

0 голосов
/ 04 декабря 2018

Я пытался обновить DocumentReference, но не смог этого сделать.

update() метод завершился неудачно.Как это использовать?(Как передать аргумент?)

firebase-admin версия - 6.3.0.
@google-cloud/firestore версия - 0.19.0.

❯ firebase functions:shell
i  functions: Preparing to emulate functions.
Warning: You're using Node.js v8.14.0 but Google Cloud Functions only supports v6.11.5.
✔  functions: sampleFunc
firebase > const admin = require('firebase-admin');
firebase > admin.initializeApp();
firebase > let ref = admin.firestore().collection("users").doc('edqupYQhzqV1ODjEpoJn');
firebase > let updates = { email: 'xxx@yyy.zzz' };
firebase > ref.update(updates).then(value => console.log(value) );
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. Input is not a plain JavaScript object.
    at WriteBatch.update (/Users/xxx/Desktop/sample-functions/functions/node_modules/@google-cloud/firestore/build/src/write-batch.js:359:23)
    at DocumentReference.update (/Users/xxx/Desktop/sample-functions/functions/node_modules/@google-cloud/firestore/build/src/reference.js:387:14)

Обновление
Документ уже создан, поэтому get() работает.

firebase > ref.get().then(snapshot => console.log(snapshot.data()));

Ошибки также возникают и в set().

firebase > ref.set({email: 'aaa@bbb.ccc'}, {merge: true}).then(value => console.log(value));
Error: Argument "data" is not a valid Document. Input is not a plain JavaScript object.
    at Validator.(anonymous function).values [as isDocument] (/Users/xxx/Desktop/sample-functions/functions/node_modules/@google-cloud/firestore/build/src/validate.js:99:27)
    at WriteBatch.set (/Users/xxx/Desktop/sample-functions/functions/node_modules/@google-cloud/firestore/build/src/write-batch.js:232:25)
    at DocumentReference.set (/Users/xxx/Desktop/sample-functions/functions/node_modules/@google-cloud/firestore/build/src/reference.js:349:27)

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Я никогда не пробовал использовать Admin SDK в функциях: shell, как вы делаете в своем примере.Однако я могу легко воспроизвести вашу ошибку.Я предполагаю, что функции: shell каким-то образом вмешиваются в вашу переменную updates.Когда я регистрирую updates undefined объединяется в вывод

firebase > console.log(updates)
{ email2: 'xxx@yyy.zzz' }
undefined

Если вы поместите свой код в файл JS, инициализируйте свое приложение с учетной записью службы и запустите с узлом, скорее всего, он будет работать нормально!

Подробнее об использовании учетной записи службы

0 голосов
/ 17 марта 2019

сначала создайте объект, затем присвойте свои значения полю / свойству этого объекта, например:

var myObj = {};
myObj["myfield"] = myvalue;

теперь передайте в качестве второго аргумента .set или .update.

0 голосов
/ 04 декабря 2018

Следуя опубликованному вами примеру, вы пытаетесь обновить несуществующий документ.В этом случае вы должны сначала создать его.

Если вы не уверены, существует ли документ, пропустите опцию объединения новых данных с любым существующим документом, чтобы избежать перезаписи всего документа.

Из документации Google:

var cityRef = db.collection('cities').doc('BJ');

var setWithOptions = cityRef.set({
  capital: true
}, {merge: true});

Ссылка: Firestore Добавить данные

...