抛出新函数.https.HttpsError on Firebase Cloud Function拒绝客户端上的内部错误

Gab*_*der 6 javascript firebase reactjs google-cloud-functions

我在Firebase项目中部署了以下云功能:

exports.createCredentials = functions.https.onCall((data, context) => {
    if(!context.auth)
        throw new functions.https.HttpsError('failed-auth', 'You must be authenticated to call this function')

    const { email, password } = data;

    if(!(typeof email === 'string'))
        throw new functions.https.HttpsError('invalid-email', 'Email must be a string')
    if(!(typeof password === 'string'))
        throw new functions.https.HttpsError('invalid-password', 'Password must be a string')

    return admin.auth().createUser({
        email,
        password
    })
    .then(userRecord => {
        return { userRecord }
    })
    .catch((error) => { 
        throw new functions.https.HttpsError(error.code, error.message)
    })
})
Run Code Online (Sandbox Code Playgroud)

问题是每当我抛出一个新的functions.https.HttpsError而不是在客户端捕获的错误作为文档状态时,我得到一个internal错误代码.在我的函数的日志中,它显示了一个未处理的错误,我尝试调用HttpsError.这是日志的一个例子:

Unhandled error Error: Unknown error status: auth/email-already-exists
    at new HttpsError (/user_code/node_modules/firebase-functions/lib/providers/https.js:80:19)
    at admin.auth.createUser.then.catch (/user_code/index.js:26:9)
    at process._tickDomainCallback (internal/process/next_tick.js:135:7)
Run Code Online (Sandbox Code Playgroud)

我知道如果没有抛出HttpsError,这种类型的函数会拒绝内部错误,但据我所知,在我的函数中并非如此.我在React中编写我的前端,所以这就是我如何调用这个firebase函数:

let options = {
    email: arquitect.email,
    password: arquitect.password
}

let createCredentials = firebase.functions().httpsCallable('createCredentials')
createCredentials(options)
    .then(result => {

    })
    .catch(error => console.log(error))
Run Code Online (Sandbox Code Playgroud)

有什么我想念的吗?

Lun*_*ast 8

根据您链接的文档,您似乎没有使用functions.https.HttpsError中列出的值作为代码参数.该值必须是Google API的规范错误代码之一.例如,"failed-auth"或"invalid-email"未列在那里.您可以改为使用"permission-denied"或"invalid-argument".