gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:32:21 25 4
gpt4 key购买 nike

我创建了一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com