我正在實施一個云功能,用于使用唯一的用戶名和密碼進行注冊。
為了拋出例外,我之前做了以下事情:
注冊驗證.js
if (!validateUsername(username)) {
throw new functions.https.HttpsError(
"invalid-argument",
"Invalid username.",
{
status: "error",
code: "auth/invalid-username",
message: "Username must be between 3 and 30 characters, including numbers, letters, hyphens, periods, or underscores.",
}
);
}
注冊.function.js
try {
await validateSignUpData(
username,
email,
password,
repeatPassword,
name,
birthday,
clientIp
);
} catch(err) {
if (err instanceof functions.https.HttpsError) {
throw err;
}
// An unknown error has occurred
console.error(err);
throw new functions.https.HttpsError(
"unknown",
"Unexpected error.",
{
status: "error",
code: err.code ?? "unknown",
message: err.message ?? "The registration request could not be processed. Please, try again later."
}
);
}
但是,我真的不喜歡這種在 signUpValidation 模塊中拋出例外的方式......對我來說拋出“AuthErrors”而不是“HttpsErrors”更有意義。
因此,由于似乎無法擴展默認的 Firebase 錯誤,我決定創建自己的util/authErrors模塊:
class AuthError extends Error {
constructor(code, message) {
super(message);
this.code = code;
this.name = "AuthError";
}
}
const authErrors = Object.freeze({
usernameAlreadyExists(message = "The username is already in use by an existing account") {
return new AuthError('auth/email-already-exists', message);
}
... more errors
});
module.exports = authErrors;
如您所見,我為每種錯誤型別創建了自定義錯誤和一些工廠函式。然后,在我的signUpValidation.js 中,我只做:
if (!(await isUsernameUnique(username))) {
throw authErrors.usernameAlreadyExists();
}
是否可以擴展 FirebaseError?如果不是,為什么?
以這種方式作業以在 Cloud Functions 中拋出自定義例外是否被認為是一種不好的做法?我的意思是,我應該拋出 HttpsErrors 嗎?
uj5u.com熱心網友回復:
如果您要區別對待它,擁有自定義錯誤型別很有用。例如,如果您有一個 try/catch 塊并希望為您的自定義錯誤使用不同的邏輯。但是在這里您將錯誤傳遞給客戶端,該客戶端不知道 Firebase HttpsError 或您的自定義 AuthError。因為最后您的物件將被序列化為 JSON,而在另一端,沒有將其轉換回 HttpsError 或 AuthError 的類。
同樣在 HTTP 協議級別,身份驗證錯誤由 HTTP 狀態代碼(例如 401,403)定義,因此它們本質上不是不同的物件型別。我的意思是,當無法像對待客戶端那樣進行轉換時,在服務器端擁有自定義 AuthError 類并沒有什么優勢。對于客戶端,HTTP 狀態代碼是區分 Auth 錯誤與其他型別錯誤的關鍵。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/369208.html
標籤:javascript 节点.js 火力基地 错误处理 谷歌云功能
