Аутентификация Firebase не выдает displayName при использовании облачных функций - PullRequest
0 голосов
/ 07 ноября 2019

Я работаю над приложением, в котором мне нужно зарегистрировать пользователя с информацией, такой как его имя пользователя и многое другое. Аутентификация Firebase работает нормально, а облачные функции Firebase работают до некоторой степени. Теперь я хочу получить user.uid, чтобы добавить дополнительную информацию при регистрации, которую я не могу понять, как это сделать.

Пока что я могу только поместить user.uid и электронную почту в базу данных firebase. но мне нужен доступ к этому uid, чтобы добавить к тому же пользователю дополнительную информацию, такую ​​как имя, адрес, номер телефона и т. д.

Filename: Signup.js

import React from 'react';
import {
  View,
  Text,
  StyleSheet,
  TextInput,
  ActivityIndicator,
  ScrollView
} from 'react-native';

import colors from '../constants/colors';
import CustomActionButton from '../components/CustomButton';
import * as firebase from 'firebase';
import { Ionicons } from "@expo/vector-icons";

class SignUp extends React.Component {
  constructor() {
    super();
    this.state = {
      displayName: '',
      email: '',
      password: '',
      isLoading: false
    };
  }

  onSignUp = async () => {
    if (this.state.email && this.state.password) {
      this.setState({ isLoading: true });
      try {
        const response = await firebase
          .auth()
          .createUserWithEmailAndPassword(
            this.state.email,
            this.state.password)
        if (response) {
          this.setState({ isLoading: false });
          alert('SignUp Succesfull. Now you can go back and Login.');
        }
      } catch (error) {
        this.setState({ isLoading: false });
        if (error.code == 'auth/email-already-in-use') {
          alert('User already exists.Try loggin in');
        }
        console.log(error);
      }
    } else {
      alert('Please enter email and password');
    }
  };

  render() {
    return (
      <View style={styles.container}>
          <ScrollView>
        {this.state.isLoading ? (
          <View
            style={[
              StyleSheet.absoluteFill,
              {
                alignItems: 'center',
                justifyContent: 'center',
                zIndex: 1000,
                elevation: 1000
              }
            ]}
          >
            <ActivityIndicator size="large" color={colors.logoColor} />
          </View>
        ) : null}
        <View style={{ flex: 1, justifyContent: 'center' }}>
        <View
          style={{ flex: 1, alignItems: "center", justifyContent: "center" }}
        >
          <Ionicons name="ios-pulse" size={150} color={colors.logoColor} />
          <Text style={{ fontSize: 30, marginBottom: 20, color: colors.logoColor }}>Mind Coach</Text>
        </View>
        <TextInput
            style={styles.textInput}
            placeholder={'John Doe'}
            placeholderTextColor={colors.bgTextInputDark}
            keyboardType="default"
            onChangeText={displayName => this.setState({ displayName })}
          />
          <TextInput
            style={styles.textInput}
            placeholder={'abc@example.com'}
            placeholderTextColor={colors.bgTextInputDark}
            keyboardType="email-address"
            onChangeText={email => this.setState({ email })}
          />
          <TextInput
            style={styles.textInput}
            placeholder="enter password"
            placeholderTextColor={colors.bgTextInputDark}
            secureTextEntry
            onChangeText={password => this.setState({ password })}
          />
          <View style={{ alignItems: 'center' }}>
            <CustomActionButton
              onPress={this.onSignUp}
              style={[ styles.loginButtons, { borderColor: colors.bgError, marginBottom: 30, }]}
            >
              <Text style={{ color: 'white' }}>Sign Up</Text>
            </CustomActionButton>
          </View>
        </View>
        </ScrollView>
      </View>
    );
  }
}
export default SignUp;
Filename: index.js (firebase-cloud-functions)

const functions = require('firebase-functions');

const admin = require('firebase-admin');

admin.initializeApp();

exports.createUserInDatabase = functions.auth.user().onCreate(async user => {
  const email = user.email
  const displayName = user.displayName;


  try {
    const snapshot = await admin
      .database()
      .ref('users/' + user.uid)
      .set({ email: email, displayName: displayName, uid: user.uid });
    return snapshot;
  } catch (error) {
    console.log(error);
    return error;
  }
});

Как вы можете видеть, электронная почта и uid отображаются в базе данныхно не displayName. Мне нужна помощь с этим, если кто-нибудь может. Database

1 Ответ

0 голосов
/ 07 ноября 2019

Триггер functions.auth.user().onCreate( вызывается сразу после того, как ваш код вызывает firebase.auth().createUserWithEmailAndPassword(this.state.email, this.state.password). Таким образом, в вашем коде облачных функций будут доступны только минимальные свойства, а не отображаемое имя.

Если вы также хотите написать отображаемое имя, у вас есть две основные опции:

  1. Запишите отображаемое имя в базу данных из кода вашего приложения, сразу после этого также установите его в профиле пользователя (при условии, что вы делаете последнее).
  2. Создайте отдельное (запускаемое по HTTPS или вызываемое) облакоФункция, которой вы передаете отображаемое имя и которая затем устанавливает его как в профиле, так и в базе данных.

Оба варианта хороши, и какой вариант вы выберете, зависит от требований вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...