[英]update firestore document with cloud functions
你好,我正在尝试使用云函数更新 firestore 中的文档,但我对云函数如何知道要更新的文档是我的代码感到困惑
云函数代码
exports.newsletterGreetConfirm = functions.firestore
.document('newsletter/{newsletterId}')
.onUpdate((change, context) => {
const newValue = change.after.data();
console.log(newValue);
return 0;
});
在我的云函数 shell 中,我将以下对象传递给我的newsletterGreetConfirm
函数
{email:"test@gmail.com",id:"LgNqtD6Ih7SYPEEz8jJl",subscribedToNewsletterList:true,timestamp:12321312}
我的输出undefined
我的目标是在用户点击确认电子邮件中的按钮或链接时确认电子邮件地址。 刚刚在构建此功能的第一阶段感谢所有帮助! 我也使用react
这个想法是通过电子邮件中发送的URL直接向Firebase生成HTTP请求,或者通过React进行响应。
您可以将它们发送到网址example.com/verify/USER_DOC_ID
假设您使用react-router-dom
,并且希望使用Web Firebase API以避免创建HTTP请求,则可以在React组件中执行以下操作(这也假设您在React中正确使用了Firestore):
import React, {Component} from 'react':
import firestore from './firestore'; //this is your config file
import {withRouter} from 'react-router-dom';
class Verify extends Component {
componentDidMount(){
const {pathname} = this.props.location;
const ID = pathname.split('/')[2];
//DO THE FIREBASE UPDATE HERE
}
render(){...}
export default withRouter(Verify);
现在,您可以在这里放置//DO THE FIREBASE UPDATE HERE
的几个选项。 您可以创建对Firebase的http请求,也可以使用Web端Firebase。 如果您使用的是Web端Firebase,则只需在Firebase中更新文档(请注意,如果您执行提取请求,则无需在react中导入firestore。)
反应方式包括以下内容:
const ref = firebase.firestore().collection('newsletter').doc(ID);
ref.get().then((doc) => {
if(doc.exists()){
ref.update({verified: true});
});
与firestore进行交互的逻辑在后端与Admin API非常相似,但是您会将其包装在云功能的HTTP请求中:
exports.verify = functions.https.onRequest((req, res) => {
// admin api call with req params or body
});
使用上面的代码,您可以直接从电子邮件中导航到此处,直接使用HTML进行响应,也可以通过React应用中的获取请求fetch("https://example.com/verify/ID").then(...)
例如fetch("https://example.com/verify/ID").then(...)
来调用它fetch("https://example.com/verify/ID").then(...)
如果您想了解我所描述的上述任何一种方法的更多细节,请将其作为单独的问题发布,如果您无法在SO上找到它,请告诉我,我将尽力回答。
这不是在Firestore中更新文档的方法。 您提供的代码用于Cloud Firestore触发器 ,这是一种响应Firestore集合中的CRUD事件的方式。
如果要更新Firestore文档,则需要阅读有关如何向Cloud Firestore添加数据的文档 。
作为一个例子(直接取自文档):
// Add a new document in collection "cities"
db.collection("cities").doc("LA").set({
name: "Los Angeles",
state: "CA",
country: "USA"
})
.then(function() {
console.log("Document successfully written!");
})
.catch(function(error) {
console.error("Error writing document: ", error);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.