【问题标题】:snap.data is not a function in onUpdatesnap.data 不是 onUpdate 中的函数
【发布时间】:2019-03-29 06:30:59
【问题描述】:

我有两个触发onCreateonUpdate 的函数,但是onUpdate 中的{uid} 返回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} as 更新数据库来触发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)

【问题讨论】:

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


    【解决方案1】:

    正如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}`));
      });
    

    【讨论】:

    • 谢谢仁。我确实有一个问题是context 的使用。它是干什么用的?从我所见,它从未被定义或使用过? ESLint 喜欢这样告诉我。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      相关资源
      最近更新 更多