🙏
【情報求む】next12のmiddlewareでTypeError adapter is not functionが出た場合の対処法
結論
_middleware.ts内部でaxiosを使おうとするとTypeError adapter is not function
が出る。
@vespaiach/axios-fetch-adapterを追加して、axiosのインスタンス生成時にfetchAdapterを使えるようにしてあげれば使える。
ミドルウェアとAxiosインスタンス
_middleware.ts
import {NextFetchEvent, NextRequest, NextResponse} from "next/server";
import fetchAdapter from "@vespaiach/axios-fetch-adapter";
import {apiServer} from "../../utils/apiServer";
export default async function middleware(req: NextRequest, ev: NextFetchEvent) {
apiServer.defaults.adapter = fetchAdapter
const {data} = await apiServer.get('auth/me')
if (!data.authenticated) {
return NextResponse.redirect('http://localhost:3000/auth/login')
}
return NextResponse.next()
}
apiServer.ts
import axios from "axios";
export const apiServer = axios.create({
baseURL: process.env.API_ENDPOINT,
responseType: 'json',
withCredentials: true,
headers: {
"Content-Type": "application/json",
}
})
よくわからん点
- _middleware.tsの処理がサーバーサイドで実行されてるがこれが普通なのか
- fetchAdapterが必要な条件はなんなのか?
- サーバーサイドだからなのかと思ったが、getServerSidePropsの時とかはアダプターいじらなくても普通に動いた
- Service Worker上ではAxiosの標準のリクエストが使えない云々の記述は見たが、nextjsのSWについてよくわかってない
リファレンス
Discussion
全く同じところでひっかかりました。
middleware上ではnode 特有のAPIが使用不可になっているのが原因のようです。自分の場合は、postしたかったのですが、axiosもだめだし(fetech-adaptorもだめでした) superagentとかも使用できないので、悩みましたが、 のDOCを読んで使えるAPIを参考に素のrequest とfetchでpostやったらうまくいきました。
なるほど!共有ありがとうございます!