javascript - 如何从 Google Firebase 函数中失败的 Promise 返回自定义错误消息?

标签 javascript firebase google-cloud-functions

我创建了一个 Firebase 云函数来创建新用户(我正在创建一个自定义函数,而不是使用 firebase.auth().createUserWithEmailAndPassword 因为我想为创建时的用户)。我想在 promise 被拒绝时显示自定义错误消息,或者至少保留原始 Firebase 错误消息(如果发生电子邮件地址已在使用等情况)。然而,现在每当 promise 被拒绝时,客户端只能看到 500 Internal Server Error,这对最终用户没有太大帮助。我认为这正如 Firebase docs 所预期的那样发生

If the callable trigger is invoked, but fails with an unhandled exception or returns a failed promise, the request is rejected with 500 Internal Server Error, with an error code of INTERNAL. This prevents coding errors from accidentally being exposed to end users.

是否有一种好方法可以在云函数中保留原始错误消息,而不只是默认为 500 错误?我想我可以在 catch block 中编写自己的错误处理,这将“解决”我想向用户显示的错误,但这似乎是一个困惑的解决方案......有什么想法吗?我的代码如下:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

const serviceAccount = require('./serviceAccount.json');
const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG);
adminConfig.credential = admin.credential.cert(serviceAccount);
admin.initializeApp(adminConfig);

exports.createUser = functions.https.onCall((data, context) => {
    return new Promise((resolve, reject) => {
        const { name, email, password } = data || {};
        if (!name || name.length > 50 || /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/.test(email) === false || password.length < 8) {
            reject(new Error("Invalid data"));
        }
        else {
            resolve(admin.auth().createUser({
                email,
                password,
                displayName: name
            }));
        }
    });
});

编辑——下面的答案解决了我的问题;这是我更新的代码,以防其他人有类似的需求:

exports.createUser = functions.https.onCall((data, context) => {
    return new Promise((resolve, reject) => {
        const { name, email, password } = data || {};
        if (!name || name.length > 50 || /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/.test(email) === false || password.length < 8) {
            reject(new functions.https.HttpsError('invalid-argument', 'Invalid data'));
        }
        else {
            admin.auth().createUser({
                email,
                password,
                displayName: name
            })
            .then( res => resolve(res))
            .catch( err => reject(new functions.https.HttpsError('failed-precondition', err.message || 'Internal Server Error')))
        }
    });
});

最佳答案

documentation建议您应该抛出 HttpsError以及发送给客户的信息。字符串代码将被转换为 HTTP 状态代码,并且您传递的消息也将可用。

关于javascript - 如何从 Google Firebase 函数中失败的 Promise 返回自定义错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60590229/

相关文章:

php - 是否可以在 If 语句中包含 Php 变量或 JavaScript 中的 URL?

javascript - 如何修复 Node 中未定义错误的 "Cannot read property ' trim'

javascript - Firestore 云功能无法在本地运行

javascript - Firebase 总用户数

javascript - Firebase:如何在 React Native 中异步更新记录的值?

android - 如何在 list 中设置 Android Firebase 通知?

firebase - Firebase 云功能没有 CDN 缓存命中

javascript - 将数组中的每个字符串转换为 JavaScript 数组

javascript - 如何使对话框位于窗口中心?

javascript - 使用来自对象的嵌套数组值设置状态数组