#node.js #reactjs #firebase #google-cloud-firestore #google-cloud-functions
#node.js #reactjs #firebase #google-облако-firestore #google-cloud-функции
Вопрос:
здравствуйте, я пытаюсь обновить документ в 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
Ответ №1:
Идея состоит в том, чтобы либо сгенерировать HTTP-запрос непосредственно в firebase через URL, отправленный по электронной почте, либо сделать это через React.
Вы могли бы отправить их по URL example.com/verify/USER_DOC_ID
Предполагая, что вы используете react-router-dom
и хотите использовать web firebase API, чтобы избежать создания HTTP-запроса, вам следует сделать что-то вроде следующего в вашем компоненте React (это также предполагает, что вы используете firestore в 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-запрос к firebase, либо использовать firebase на веб-стороне. Если вы используете веб-firebase, вам просто нужно обновить документ в firebase (обратите внимание, что вам не нужно импортировать firestore в react, если вы выполняете запрос на выборку.)
способ react включает в себя что-то вроде этого:
const ref = firebase.firestore().collection('newsletter').doc(ID);
ref.get().then((doc) => {
if(doc.exists()){
ref.update({verified: true});
});
Логика взаимодействия с firestore очень похожа на серверную часть с Admin API, однако вы обернете ее в HTTP-запрос в cloud-functions:
exports.verify = functions.https.onRequest((req, res) => {
// admin api call with req params or body
});
С помощью приведенного выше кода вы можете либо перейти сюда непосредственно из электронного письма, отвечая непосредственно с помощью HTML, либо вызвать его с помощью запроса на выборку в приложении react, например fetch("https://example.com/verify/ID").then(...)
.
Если вы хотите получить более подробную информацию о любом из описанных мной выше методов, опубликуйте это как отдельный вопрос, если вы не можете найти его на SO, дайте мне знать, и я сделаю все возможное, чтобы ответить.
Комментарии:
1. @helloworld вот ссылка на руководство, которое вы могли бы посмотреть для firestore с react: hackernoon.com /…
2. Обратите внимание, что вам также потребуется настроить правила базы данных и загрузить файл конфигурации. Вероятно, вам следует сначала загрузить файл конфигурации (firebase упрощает эту часть) и только в крайнем случае корректировать правила базы данных. Вам не нужно будет выполнять эти шаги, если вы используете облачные функции.