web-dev-qa-db-ja.com

新しい関数をスローします。FirebaseCloud関数でhttps.HttpsErrorがクライアントの内部エラーとして拒否されます

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)
    })
})

問題は、クライアントでエラーが docs 状態としてキャッチされるのではなく、新しい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)

このタイプの関数は、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))

足りないものはありますか?

7

リンクしたドキュメントのとおり、コードパラメータに functions.https.HttpsError にリストされている値を使用していないようです。値は、GoogleAPIの標準的なエラーコードの1つである必要があります。たとえば、「failed-auth」や「invalid-email」はそこにリストされていません。代わりに、「permission-denied」または「invalid-argument」を使用できます。

8
LundinCast