snap.data不是onUpdate中的函数

时间:2018-10-24 18:33:08

标签: javascript firebase google-cloud-firestore google-cloud-functions

我有两个触发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}`));
  });

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()
  });
};

通过使用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)

2 个答案:

答案 0 :(得分:2)

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: '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}`));
  });

答案 1 :(得分:1)

可以通过阅读Handle Event Data上的文档轻松解决问题。但是,如果您像我一样浏览文档,那么解决方法是

.onUpdate(change => {
  const user = change.after.data();