javascript 如何防止Firebase云函数崩溃,如何发送错误消息作为响应?

oxiaedzo  于 2023-05-16  发布在  Java
关注(0)|答案(1)|浏览(137)

我创建了一个简单的createUser函数,它在调用时执行。但我有一个问题。当用户尝试注册一个已经存在的电子邮件时,该功能崩溃。我的意思是,这是确定的,因为没有人希望有2个用户具有相同的电子邮件地址,但我想防止粉碎功能,相反,我想发送一个错误消息作为响应。

export const createUserTest = functions.https.onCall((data, context) => {
  const {email, password} = data;

  return new Promise((resolve, reject)=>{
    try{
      admin
           .auth()
           .createUser({
             email: email,
             emailVerified: false,
             password: password,
             disabled: false,
           })
           .then((user) => {
             resolve({
                 result: 'success',
                 user: user,
             }) ;
           })
           .catch((error) => {
             reject(error) ;
           });
    }catch(error) {
      reject (error)
    }  
  })  
});

我试着把函数放到try/catch块中,但没有用。你知道我怎样才能达到目标吗?

gk7wooem

gk7wooem1#

正如Callable Cloud Functions文档中所解释的那样,“为了确保客户端获得有用的错误详细信息,通过抛出(或返回一个Promise rejected with)functions.https.HttpsError的示例来从可调用对象返回错误”。
错误具有code属性,该属性可以是此处列出的值之一。在您的情况下,最合适的似乎是already-exists
另一方面,您会在Admin SDK Authentication错误列表中找到here,并且您会看到,如果提供的电子邮件已被现有用户使用,则错误代码为auth/email-already-exists
因此,您可以如下调整代码:

export const createUserTest = functions.https.onCall((data, context) => {
    const { email, password } = data;

    return admin
        .auth()
        .createUser({
            email: email,
            emailVerified: false,
            password: password,
            disabled: false,
        })
        .then((user) => {
            return {
                result: 'success',
                user: user,
            }
        })
        .catch((error) => {
            if (error.code === 'auth/email-already-exists') {
                throw new functions.https.HttpsError('already-exists', 'The provided email is already in use by an existing user');
            } else {
                throw new functions.https.HttpsError('...other code....', '...');
                // If an error other than HttpsError is thrown, your client instead receives an error with the message INTERNAL and the code internal.
            }
        });

});

请参阅文档中的此处,如何在客户端处理错误。如果error.code == 'already-exists',你知道这是因为电子邮件已经在使用中。

相关问题