我正在開發一個 Next.js 應用程式,并且我有一個按以下方式定義的 API:
export default function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method === 'GET') {
fn1Get(req, res);
} else if (req.method === 'POST') {
fn1Post(req, res);
} else {
res.status(501).json({ operation: `${req.method}: not implemented` });
}
}
async function fn1Get(
req: NextApiRequest,
res: NextApiResponse
): Promise<void> {
const authenticated = await checkAuth(req, res);
if (authenticated) {
// Get Stuff
res.status(200).json({status: 'all right!'});
}
}
async function fn1Post(
req: NextApiRequest,
res: NextApiResponse
): Promise<void> {
const authenticated = await checkAuth(req, res);
if (authenticated) {
// Post Stuff
res.status(201).json({status: 'all right!'});
}
}
const checkAuth = async (req: NextApiRequest, res: NextApiResponse) => {
const tokenValid = await extnernalApiCall(getToken(req));
if (!tokenValid) {
res.status(403).json({ error: 'Authentication Failed' });
}
return tokenValid
};
我正在嘗試找到一個更簡單的設定來定義經過身份驗證的方法,而不是在其中添加行const authenticated = await checkAuth(req, res);
在 Java 或 Python 等其他語言中,我可以使用裝飾器/注釋/AOP,例如:
@checkAuth
async function fn1Get(
req: NextApiRequest,
res: NextApiResponse
):
我可以在javascript中做一些接近它的事情嗎?也許通過包裝函式,和/或使用系結/呼叫/應用?
偽代碼示例:
const checkAuth = async (fn) => {
const req = arguments[1];
const res = arguments[2];
const tokenValid = await extnernalApiCall(getToken(req));
if (!tokenValid) {
res.status(403).json({ error: 'Authentication Failed' });
}
return fn(arguments);
}
async function fn1Get = checkAuth(_fn1Get(
req: NextApiRequest,
res: NextApiResponse
): Promise<void> {
const authenticated = await checkAuth(req, res);
if (authenticated) {
// Get Stuff
res.status(200).json({status: 'all right!'});
}
})
如您所見,我要驗證的所有函式都將接收相同的兩個引數和req(請求和回應),并且我的驗證函式還需要這res兩個引數才能從未認證reqres
我使用的技術是帶有 React 17、TypeScript、ECMA6 的 Next.js
uj5u.com熱心網友回復:
是的,您可以使用包裝函式來實作這一點(無論如何,這基本上就是裝飾器)。該包裝函式必須回傳一個函式。類似于以下內容(您必須相應地調整型別):
const checkAuth = (fn) => {
return async (req: NextApiRequest,res: NextApiResponse): Promise<void> => {
const tokenValid = await extnernalApiCall(getToken(req));
if (!tokenValid) {
res.status(403).json({ error: 'Authentication Failed' });
} else {
fn(req, res);
}
}
}
const fn1Get = checkAuth((
req: NextApiRequest,
res: NextApiResponse
): Promise<void> => {
// Get Stuff
res.status(200).json({status: 'all right!'});
})
話雖如此,我對 next.js 并不熟悉。可能有一種方法可以注冊中間件處理程式,該處理程式會在每個請求上觸發,而無需顯式包裝每個處理程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/464468.html
標籤:javascript ecmascript-6 异步等待 下一个.js 注释
上一篇:將陣列轉換為具有自定義屬性的物件
