你好,我试图通过云功能更新Firestore中的文档,但是我对云功能如何知道要更新的文档感到困惑
云功能代码
exports.newsletterGreetConfirm = functions.firestore
.document('newsletter/{newsletterId}')
.onUpdate((change, context) => {
const newValue = change.after.data();
console.log(newValue);
return 0;
});
在我的云函数外壳程序中,我将以下对象传递给了我的newsletterGreetConfirm
函数
{email:"test@gmail.com",id:"LgNqtD6Ih7SYPEEz8jJl",subscribedToNewsletterList:true,timestamp:12321312}
我的输出是undefined
我的目标是在用户单击确认电子邮件中的按钮或链接时确认电子邮件地址。仅在构建此功能的第一阶段,感谢您的所有帮助!我也使用react
答案 0 :(得分:4)
其想法是通过电子邮件中发送的URL直接向Firebase生成HTTP请求,或通过React进行响应。
您可以将它们发送到URL 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进行响应,也可以通过诸如fetch("https://example.com/verify/ID").then(...)
之类的react应用中的获取请求来调用它。
如果您想了解我所描述的上述任何一种方法的更多细节,请将其作为单独的问题发布,如果您无法在SO上找到它,请告诉我,我将尽力回答。
答案 1 :(得分:0)
这不是在Firestore中更新文档的方法。您提供的代码是针对Cloud Firestore trigger的,它是一种响应Firestore集合中的CRUD事件的方法。
如果要更新Firestore文档,则需要read the docs about how to add data to 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);
});