snap.data не является функцией в onUpdate - PullRequest
0 голосов
/ 24 октября 2018

У меня есть две функции, которые запускают onCreate и onUpdate, однако {uid} в onUpdate возвращает undefined, в то время как onCreate возвращает {uid}.

Как можноЯ получаю {uid} для работы onUpdate?

onUpdate.f.js - {uid} - undefined

exports = module.exports = functions.firestore
  .document('users/{uid}/alerts/{name}') //UID is the User ID value stored in alerts
  .onUpdate(snap => {
    const user = snap.data();
    console.log(user);
    const msg = {
      to: user.email,
      from: 'notifications@example.com',
      templateId: user.template,
      dynamic_template_data: {
        firstName: user.firstName,
        email: user.email,
        id: user.uid
      }
    };
    return sgMail.send(msg).catch(err => console.log(`${user.email} - ${err}`));
  });

onCreate.f.js - {uid} правильно

exports = module.exports = functions.firestore
  .document('users/{uid}/alerts/{name}')
  .onCreate(snap => {
    const user = snap.data();
    console.log(user);
    const msg = {
      to: user.email,
      from: 'notifications@example.com',
      templateId: user.template,
      dynamic_template_data: {
        firstName: user.firstName,
        email: user.email,
        id: user.uid
      }
    };
    return sgMail.send(msg).catch(err => console.log(`${user.email} - ${err}`));
  });

Поля в doc Оповещения из внешнего интерфейса

doCreateAlert = (id, email, firstName, lastName, alertType, transactionEmailId) => {
const db = this.firestore;
return db.doc(`users/${id}/alerts/${alertType}`).set({
    uid: id,
    name: alertType,
    email: email,
    firstName: firstName,
    lastName: lastName,
    template: transactionEmailId,
    dateCreated: new Date(),
    dateModified: new Date()
  });
};

Активировано onUpdateобновляя базу данных с помощью onClick={this.updateAlert} как

updateAlert = () => {
    const { firebase, userID } = this.props;
    const companyTypeSetup = db.doc(`users/${userID}/alerts/emailVerified`);
    companyTypeSetup.update({
      dateModified: new Date()
    });
  };

на внешнем интерфейсе, я получаю ошибку

Uncaught (in promise) Error: No document to update: projects/app/databases/(default)/documents/users/undefined/alerts/emailVerified

, и функция никогда не запускается.Если я вручную обновлю doc в Firestore, я получаю сообщение об ошибке в журнале функций firebase как

TypeError: snap.data is not a function
at module.exports.functions.firestore.document.onUpdate.snap (/user_code/lib/auth/onUpdate.f.js:17:23)
at cloudFunctionNewSignature (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:105:23)
at cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:135:20)
at /var/tmp/worker/worker.js:754:24
at process._tickDomainCallback (internal/process/next_tick.js:135:7)

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Как показывает руководство , onUpdate имеет два параметра: change и context.Вы используете change, так как вы можете захотеть получить доступ к значению до обновления или после обновления.Предполагая, что вы хотите значение после обновления, это будет выглядеть так:

exports = module.exports = functions.firestore
  .document('users/{uid}/alerts/{name}') //UID is the User ID value stored in alerts
  .onUpdate((change, context) => {
    const user = change.after.data();
    console.log(user);
    const msg = {
      to: user.email,
      from: 'notifications@example.com',
      templateId: user.template,
      dynamic_template_data: {
        firstName: user.firstName,
        email: user.email,
        id: user.uid
      }
    };
    return sgMail.send(msg).catch(err => console.log(`${user.email} - ${err}`));
  });
0 голосов
/ 24 октября 2018

Проблему легко решить, прочитав документы по адресу Обработка данных события .Однако, если вы похожи на меня и просматриваете документы, решение будет

.onUpdate(change => {
  const user = change.after.data();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...