我使用的是Next.js、Auth.js和mongoose,我的問題是我想用一個名為withDBConnection
的包裝器/輔助函數包裝所有控制器,以節省我的時間。如果不是每次都與數據庫建立連接,它會獲取控制器并在連接后返回:
type Controller <Args extends any[]> = (...args: Args) => any;
export const withDBConnection = <Args extends any[]> (Controller:Controller<Args>):(...args:Args) => Promise<any> => {
return async (...args: Args) => {
try {
await dbStartConnection();
Controller(...args);
} catch (error) {
console.log("inside withDBConnection catch block");
console.log((error as AppError).message);
}
};}
使用輔助函數的示例:
export const getUser = withDBConnection( async(email: string) => {
const user = await Auth.find({discordEmail: email});
console.log("getUser", user);
return user;
});
但是控制器沒有返回值user
,我不能在Auth.js signIn()
回調中使用它:
const isExist = await getUser(user.email);
isExist
總是undefined
,所以應用程序會轉到createNewUser
控制器:
if(!isExist) await createNewUser(user);
我試圖在type Controller
和withDBConnection
中將返回類型從any
更改為mongoose類型Document
,但這讓ts抱怨email: string
主要問題是Controller(...args);調用時不返回結果,導致包裝函數返回undefined。以下代碼正確等待并返回控制器的結果