我的 nextjs 專案中需要一個中間件,它是一個 monorepo(同一個專案中的前端和后端),我需要通過中間件攔截請求并執行我基本上在每個 API 中執行的操作:身份驗證和其他控制元件。我看了一下這個 ,但我不知道如何獲取實際請求(標題、正文、查詢字串等)。
所以我在檔案夾_middleware.ts下創建了檔案/pages,這個:
import type { NextFetchEvent, NextRequest } from 'next/server';
import { NextResponse } from 'next/server';
export async function middleware(req: NextRequest, ev: NextFetchEvent) {
console.log('request - - -- - >', req);
}
我認為在req引數中我有整個請求,但我沒有。事實上,如果我記錄它,我會得到這個結果:
NextRequestHint [Request] {
sourcePage: '/_middleware',
[Symbol(internal body)]: { bodyInit: null, disturbed: false },
[Symbol(internal request)]: {
credentials: 'same-origin',
headers: BaseHeaders [Headers] { [Symbol(map)]: [Object] },
method: 'GET',
referrer: 'about:client',
redirect: 'follow',
url: NextURL { [Symbol(NextURLInternal)]: [Object] }
},
[Symbol(internal request)]: {
cookieParser: [Function: cookieParser],
geo: {},
ip: undefined,
page: { name: '/[user]', params: [Object] },
url: NextURL { [Symbol(NextURLInternal)]: [Object] }
}
}
有沒有辦法在這里獲取整個請求?或者有沒有另一種方法來做一個中間件,我可以做我為每個 API 做的一般事情?謝謝。
版本 nextjs: 12.0.9
uj5u.com熱心網友回復:
該類NextRequest擴展了一個Request基于其本地對應物的介面。您可以在以下檔案中查看可用的不同屬性:
node_modules/next/dist/server/web/spec-extension/request.jsnode_modules/typescript/lib/lib.dom.d.ts
訪問它們看起來像這樣:
// pages/api/_middleware.ts
import type { NextFetchEvent, NextRequest } from "next/server";
import { NextResponse } from "next/server";
const streamToString = async (stream: ReadableStream<Uint8Array> | null) => {
if (stream) {
const chunks = [];
for await (const chunk of stream) {
chunks.push(Buffer.from(chunk));
}
return Buffer.concat(chunks).toString("utf-8");
}
return null;
};
export async function middleware(req: NextRequest, ev: NextFetchEvent) {
console.log("Method:", req.method);
console.log("Content-Type:", req.headers.get("content-type"));
console.log("Route:", req.nextUrl.pathname);
console.log("Query String:", req.nextUrl.search);
console.log("Query Parameters:", req.nextUrl.searchParams);
console.log("Body:", await streamToString(req.body));
// do your stuff
return NextResponse.next();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/451842.html
