异步功能未终止

问题描述 投票:0回答:1

我正在编写一个异步函数async_create_user,用于create_user中形式的Firebase HTTPS函数index.js

index.js

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

我正在像这样在单个文件user.js中测试它们,然后运行node user.js该代码具有在数据库中创建User文档的预期行为,但是我对该功能的意图还在于终止该功能,以便可以使用一系列其他功能对其进行测试。我可以知道是否有一个可以终止的实现。

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);
javascript node.js firebase-authentication google-cloud-functions firebase-admin
1个回答
-1
投票

我已经编写了一个名为rubico的库,该库消除了Promises周围的许多杂物。结果是更简单的代码; 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);
  },
)

我在示例中加入了注释,但是要真正理解上面的代码,建议您先阅读intuition,然后阅读docs

© www.soinside.com 2019 - 2024. All rights reserved.