想象一下我們有一個這樣的函式:
async function doSomethingWithFriends() {
let user, friends, friendsOfFriends = null;
try {
user = await getUser();
} catch(err){
return [401, err]
}
try {
friends = await getFriends(user);
} catch (err){
return [500, err];
}
try {
friendsOfFriends = await getFriendsOfFriends(friends);
} catch(err){
return [500, err]
}
return doFriendsOfFriends(friendsOfFriends);
}
相反,是否有一些既定的模式來避免這種有些樣板代碼?
上面的代碼有兩個問題:
- 太吵了
- 我們不能使用
const
一種解決方案是只在呼叫函式中使用 try-catch,但我想知道是否有辦法一直解決它。
uj5u.com熱心網友回復:
你在用Expressjs還是什么?請提供更多資訊。我會假設你正在制作一個 API。
您可以創建一個中間件來處理控制器中的所有錯誤。然后在您的控制器中,您只需要將錯誤拋出或傳遞給下一個中間件。下面的例子。
錯誤處理中間件
export function errorHandlingController(error: ErrorRequestHandler, _req: Request, res: Response, _next: NextFunction): void {
let errorCode: number
if (error instanceof RequestPayloadError) {
errorCode = 400
} else if (error instanceof UnauthorizedError) {
errorCode = 401
} else if (error instanceof NotFoundError) {
errorCode = 404
} else {
errorCode = 500
}
res.status(errorCode).json(<GeneralResponse>{
status: responseStatus.error,
message: error.toString()
})
}
用戶控制器
export function getMyProfile(_req: Request, res: Response, next: NextFunction): void {
try {
const user = res.locals.user
if (!user) throw new UnauthorizedError('Author id not identified')
res.status(200).json({
status: responseStatus.success,
user: user
})
} catch (error: unknown) {
next(error)
}
}
uj5u.com熱心網友回復:
在這種情況下,每個函式都可以定義自定義例外。在doSomethingWithFriends只try catch使用了一個。下面的示例代碼:
(async function doSomethingWithFriends() {
async function getUser() {
throw 'getUser'
}
async function getFriends() {
throw 'getFriends'
}
async function getFriendsOfFriends() {
throw 'getFriendsOfFriends'
}
let user, friends, friendsOfFriends = null;
try {
user = await getUser();
friends = await getFriends(user);
friendsOfFriends = await getFriendsOfFriends(friends);
} catch(err){
console.log(err)
if (err) {
// custom return what you want
}
}
return doFriendsOfFriends(friendsOfFriends);
}())
uj5u.com熱心網友回復:
Promise API 的流行語可以與 switch/if 陳述句結合使用。類似下面的東西(沒有測驗它的語法錯誤等):
async function doSomethingWithFriends() {
let errID = 0;
return getUser()
.then(user => ( errID,getFriends(user)))
.then(friends => ( errID, getFriendsOfFriends(friends)))
.then(fof => ( errID, doFriendsOfFriends(fof)))
.catch(err => {switch (errID) {
case 0:
return [401, err];
case 1:
return [500, err];
...
}});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/430856.html
標籤:javascript 节点.js 异步等待
