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