Мой терминал зависает после обещания.все решает, почему?

# #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 */
  }
}