Асинхронная функция не завершается

Я пишу асинхронную функцию async_create_user, используемую для моей HTTPS-функции firebase create_user формы в index.js.

index.js

exports.create_user = functions.https.onCall(async_create_user);

Я тестирую их все в одном файле user.js вот так, и запускаю node user.js Код получает ожидаемое поведение при создании пользовательских документов в моей базе данных, но я намерен завершить эту функцию, чтобы я мог проверить ее с помощью последовательности других функций. Могу ли я узнать, есть ли реализация, позволяющая прекратить его работу.

const { admin, db } = require("../util/admin");
//const db = admin.firestore();
//const admin = require('firebase-admin');
//admin.initializeApp(config);

const config = require("../util/config");
const { uuid } = require("uuidv4");

const {
  success_response,
  error_response
} = require("../util/validators");

const firebase = require("firebase");
firebase.initializeApp(config);

const {
  validateSignupData,
  validateLoginData,
  reduceUserDetails,
} = require("../util/validators");



exports.async_create_user = async function(data, context) {
  // Perform Authentication Checks
  try {
    const userRecord = await admin.auth().createUser({
      displayName: data.displayName,
      email: data.email,
      emailVerified: true,
      password: data.password,
      disabled: false
    });

    await admin.auth().setCustomUserClaims(userRecord.uid, {user_basic: true})

    //data required for the personal?
    const PrivateUser = {
      display_name: data.displayName,
      email: data.email,
      notification_ids: [],
      saved_posts: [],
      last_updated: admin.firestore.FieldValue.serverTimestamp()
    };

    const noImg = "no-img.png";

    //sets default profile image to be the empty image
    const PublicUser = {
      profile_image:
        {
          url: "some url",
          uid: userRecord.uid
        }
    }

    await db
      .collection("users_private")
      .doc(userRecord.uid)
      .set(PrivateUser);

    await db
      .collection("users_public")
      .doc(userRecord.uid)
      .set(PublicUser);

    console.log(userRecord.uid);
    return success_response();

  } catch (error) {
    console.log("Error in creation of user account", error);
    return error_response(error);
  }
}


const mockUser =     {
  displayName: "Mallory",
  email: "[email protected]",
  password: "123456",

  disabled: false,
  emailVerified: true
}

exports.async_create_user(mockUser);

Я пытаюсь запустить непрерывный сценарий, поэтому мне нужно его завершить. — я не знаю, что это значит. Отредактируйте вопрос, чтобы более подробно объяснить, чего вы пытаетесь достичь.   —  person Prashin Jeevaganth    schedule 28.05.2020

См. также:  Как добавить NODE в конец двойного связанного списка?
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Prashin Jeevaganth

    Я написал библиотеку под названием rubico, которая устраняет множество беспорядков, связанных с обещаниями. Результат — более простой код; rubico обрабатывает асинхронное завершение, поэтому вам не нужно.

    const { pipe, fork, get, tap, tryCatch } = require('rubico')
    
    const setCustomUserClaims = uid =>
      admin.auth().setCustomUserClaims(uid, { user_basic: true })
    
    const getServerTimestamp = () => admin.firestore.FieldValue.serverTimestamp()
    
    const createPrivateUser = ({ uid, PrivateUser }) =>
      db.collection('users_private').doc(uid).set(PrivateUser)
    
    const createPublicUser = ({ uid, PublicUser }) =>
      db.collection('users_public').doc(uid).set(PrivateUser)
    
    const createUser = pipe([
      fork({
        displayName: get('displayName'), // input => input.displayName
        email: get('email'), // input => input.email
        emailVerified: () => true, // () => true
        password: get('password'), // input => input.password
        disabled: () => false, // () => false
      }), // { displayName, email, password } => { displayName, email, emailVerified, password, disabled } === userPreRecord
      admin.auth().createUser, // userPreRecord => userRecord
      tap(pipe([get('uid'), setCustomUserClaims])), // setCustomUserClaims with uid but don't care about the return
      fork({
        uid: get('uid'), // userRecord => userRecord.uid
        PrivateUser: fork({
          display_name: get('displayName'), // userRecord => userRecord.displayName
          email: get('email'), // userRecord => userRecord.email
          notification_ids: () => [],
          saved_posts: () => [],
          last_updated: getServerTimestamp,
        }),
        PublicUser: fork({
          profile_image: fork({
            url: () => 'no-img.png',
            uid: get('uid'), // userRecord => userRecord.uid
          }),
        }),
      }),
      tap(fork([ // tap: run input through the following fork of functions and discard return.
        createPrivateUser, // userRecord => createPrivateUser(userRecord)
        createPublicUser, // userRecord => createPublicUser(userRecord)
      ])),
    ])
    
    exports.async_create_user = tryCatch( // try pipe([createUser, success_response]), catch with err => {...}
      pipe([createUser, success_response]),
      err => {
        console.log("Error in creation of user account", err);
        error_response(err);
      },
    )
    

    Я включил комментарии в свой пример, но чтобы по-настоящему понять приведенный выше код, я рекомендую вам прочитать интуицию, затем документы

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: