React 360 и Cloud Firestore: статус 400 при попытке записи в базу данных - PullRequest
0 голосов
/ 16 апреля 2020

Я работаю над приложением React 360, которое требует, чтобы пользователь зарегистрировался в режиме VR. Соответствующий код в моем SignUp.js файле выглядит следующим образом:

import fire from "../../Firebase";
import "firebase/firestore";
const db = fire.firestore();

export default class SignUp extends React.Component {
  constructor() {
    super();
    this.state = {
      userData: {
        name: "",
        email: "",
        password: "",
      },
    };
  }

  createUser = () => {
    fire
      .auth()
      .createUserWithEmailAndPassword(
        this.state.userData.email,
        this.state.userData.password
      )
      .then((user) => {
        console.log("Successfully created user!");
        db.collection("users")
          .doc(this.state.userData.email)
          .set({
            profile: {
              email: this.state.userData.email,
              name: this.state.userData.name,
            },
          })
          .then(() => console.log("Successfully added user data to db"))
          .catch((err) => console.log("Error adding data", err));
      })
      .catch((error) => {
        console.log("Error creating user!", error);
      });
  };
......
......

Мой Firebase.js код:

import * as firebase from "firebase";

var config = {
  apiKey: "my key...",
  authDomain: "...",
  databaseURL: "...",
  projectId: "...",
  storageBucket: "...",
  messagingSenderId: "...",
  appId: "...",
  measurementId: "...",
};

const fire = firebase.initializeApp(config);

export default fire;

Соответствующие зависимости в package.json:

  "dependencies": {
    "react": "16.13.1",
    "react-360": "~1.1.0",
    "firebase": "^7.14.0",
    "react-360-keyboard": "^1.0.2",
    "react-360-web": "~1.1.0",
    "react-native": "~0.55.4",
    "three": "^0.87.0"
  },
  "devDependencies": {
    "babel-jest": "^19.0.0",
    "babel-preset-react-native": "^1.9.1",
    "jest": "^19.0.2",
    "react-devtools": "^2.5.2",
    "react-test-renderer": "16.0.0",
    "xopen": "1.0.0"
  },

Что происходит : вывод выглядит следующим образом:

>>> Successfully created user!
>>> GET https://firestore.googleapis.com/... 400

Пользователи могут быть созданы и аутентифицированы, и я проверил, проверив наличие новых пользователей в консоли. Однако, когда я пытаюсь записать новые пользовательские данные в мою базу данных Firestore, я получаю статус 400. В Chrome он просто говорит: Your client has issued a malformed or illegal request.... При необходимости я могу поделиться подробностями о трассировке сети.

Что я пробовал :
Я создал отдельное приложение React (не React 360) с тем же кодом и учетными данными Firebase как указано выше, и я успешно могу записать в свою базу данных Firestore.

Мой вопрос :
Как изменить вышеприведенную реализацию для успешной записи в Firestore с использованием React 360?

1 Ответ

0 голосов
/ 18 апреля 2020

Обновление:

Использование функций Firebase (с axios) для записи в базу данных вместо того, что я делал выше, работает. Новая функция createUser выглядит следующим образом:

  createUser = (userData) => {
    fire
      .auth()
      .createUserWithEmailAndPassword(userData.email, userData.password)
      .then(() => {
        console.log("Successfully created user: ", userData.email);
        axios
          .post(
            "https://...cloudfunctions.net/...",
            {
              name: userData.name,
              email: userData.email,
            }
          )
          .then((response) => {
            console.log("Successfully added user data to db!", response);
          })
          .catch((error) =>
            console.log("error occurred adding user to db", error)
          );
      })
      .catch((error) => {
        console.log("error creating user", error);
      });
  };

Функция Firbase:

exports.createNewUser = functions.https.onRequest((request, response) => {
  admin
    .firestore()
    .collection("users")
    .doc(request.body.email)
    .set({
      profile: {
        email: request.body.email,
        name: request.body.name,
      },
    })
    .then(() => {
      response.send("added user data to db!");
    })
    .catch(() => console.log("failed to add user data to db!"));
});

Я не знаю, почему это работает, а другой (более естественный) способ не работает т. Я думаю, что это связано с React 360, но я, очевидно, открыт для предложений.

...