обновить документ firestore с облачными функциями

#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 упрощает эту часть) и только в крайнем случае корректировать правила базы данных. Вам не нужно будет выполнять эти шаги, если вы используете облачные функции.