hello试图用云函数更新防火墙中的文档,但我对云函数如何知道更新哪个文档感到困惑,这是我的代码。
云函数代码
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
发布于 2019-03-17 04:37:22
其想法是要么通过电子邮件中发送的URL直接生成HTTP请求到firebase,要么通过React来完成它。
您可以将它们发送到URL example.com/verify/USER_DOC_ID
假设您使用了react-router-dom,并且希望使用web来避免创建HTTP请求,您将在您的React组件中执行如下操作(这也假设您使用的是正确的防火墙):
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的位置,您有几个选项。您可以创建指向防火墙的http请求,也可以使用web端防火墙。如果您使用的是web端防火墙,则只需更新firebase中的文档(注意,如果您正在执行获取请求,则不需要在react中导入防火墙)。
反应的方式包括这样的东西:
const ref = firebase.firestore().collection('newsletter').doc(ID);
ref.get().then((doc) => {
if(doc.exists()){
ref.update({verified: true});
});与防火墙交互的逻辑在后端与Admin非常相似,但是您将在云函数中将其封装在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(...) )中的获取请求来调用它。
如果您想了解更多关于上述任何一种方法的详细信息,请将其作为一个单独的问题发布,如果您在上面找不到,请告诉我,我会尽力回答的。
https://stackoverflow.com/questions/55203475
复制相似问题