我有两个函数可以触发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: '[email protected]',
      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: '[email protected]',
      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()
  });
};

通过使用onClick={this.updateAlert}更新数据库来触发onUpdate
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

并且该功能永远不会运行。如果我在Firestore中手动更新doc,则在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)

最佳答案

guide所示,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: '[email protected]',
      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}`));
  });

09-18 05:32