snap.data 不是 onUpdate 中的函数

Dar*_*ren 3 javascript firebase google-cloud-functions google-cloud-firestore

我有两个函数,触发器onCreateonUpdate但是,{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}`));
  });
Run Code Online (Sandbox Code Playgroud)

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}`));
  });
Run Code Online (Sandbox Code Playgroud)

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()
  });
};
Run Code Online (Sandbox Code Playgroud)

onUpdate 是通过使用onClick={this.updateAlert}as更新数据库来触发的

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

在前端我收到错误

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

并且该功能永远不会运行。如果我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)
Run Code Online (Sandbox Code Playgroud)

Jen*_*son 9

指南所示,onUpdate有两个参数:changecontext。您使用是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}`));
  });
Run Code Online (Sandbox Code Playgroud)