# #javascript #node.js #firebase #google-cloud-firestore #firebase-authentication
Вопрос:
Привет, я использую Firebase для бэкенда, и я хочу понять, почему это просто висит в терминале.
Я пытаюсь заполнить свой список аутентификации и свою базу данных Firestore, поэтому я создал сценарий заполнения. Я читаю список пользователей из файла JSON, а затем добавляю их в Auth, однако для создания соответствующей записи пользователя в Firestore я сохраняю идентификатор пользователя, который возвращается мне createUserWithEmailAndPassword
для создания объекта пользователя с именем и фамилией (тривиальные атрибуты).
После этого я возвращаю этот пользовательский объект и разрешаю все обещания с Promise.all
помощью, а затем продолжаю использовать setDoc
для добавления каждого из этих пользовательских объектов в Firestore.
Примечание. оба этих массива обещаний создаются с использованием функций сопоставления в исходном списке пользователей из JSON, а затем в возвращенном списке объектов пользователя из Auth соответственно.
Ключевым моментом здесь является то, что, несмотря на то, что все добавлено в мой Auth и Firestore просто отлично… терминал остается висеть, но безрезультатно…
const { store, auth } = require('../config.js');
const { createUserWithEmailAndPassword } = require('firebase/auth');
const { doc, setDoc } = require('firebase/firestore');
const data = require("./SEED_DATA.json");
console.log(data ? "DATA PRESENT" : "")
const seedUsers = async (users) => {
// seeds firebase Auth
const user_auth_hydrated = await Promise.all(users.map(user => {
return createUserInAuth(user)
}))
// seeds firebase Firestore
// we wait for auth because we want to retain the uids to create matching records in store
const user_store = await Promise.all(user_auth_hydrated.map(user => {
return createUserInStore(user)
}))
Promise.resolve(user_store)
}
const createUserInAuth = async ({first_name, last_name, email, password}) => {
return await createUserWithEmailAndPassword(auth, email, password)
.then((userCredential) => {
// Signed in
const {uid} = userCredential.user;
return {
ID: uid.toString(),
FIRSTNAME: first_name,
LASTNAME: last_name
}
})
.catch(err => console.log("USER ADD AUTH FAILED", err.code, err.message))
}
const createUserInStore = async ({ID, FIRSTNAME, LASTNAME}) => {
return await setDoc(doc(store, 'users', ID), {FIRSTNAME, LASTNAME})
}
seedUsers(data);
Изображение терминала, просто висящего после выполнения (в Auth и Firestore все в порядке):
Комментарии:
1. кстати, не нужно «возвращать ожидание», если вы возвращаете обещание, его следует ожидать везде, где вызывается функция. Поскольку сама функция асинхронна, поэтому обещание, возвращать ожидание-плохая практика, просто верните ожидающее обещание.
Ответ №1:
Вы не должны смешивать традиционный подход обещаний и синтаксис async / await вместе. Я советую придерживаться только асинхронности / ожидания.
Функция seedUsers
async возвращает значение undefined. Promise.resolve(user_store)
Выполнение ничего не делает, кроме создания объекта, который уничтожается в конце функции.
Вы должны исправить свой код следующим образом:
const seedUsers = async (users) => {
/* your logic */
return user_store;
}
и
const createUserInAuth = async ({first_name, last_name, email, password}) => {
try {
const userCredential = await createUserWithEmailAndPassword(auth, email, password);
/* your return logic */
} catch (error) {
/* your error logic */
}
}