🚄
nextjsのAPIでExpress呼び出す
nextからexpressのインスタンスを噛ませて呼び出せる小ネタを見つけたのでメモ。
ほとんど使うこと無いと思われるが、何らかの理由で外部のアプリケーションを呼び出したいケースはありそう
やり方
すべてのルーティングを受けたいので、/api/express/[[...props]].ts
などcatch allなルーティングにする。
あとはexpress
でインスタンスを生成し、handler
で受け取るreq
とres
をそのまま渡す。
// /api/express/[[...props]].ts
import { NextApiHandler } from "next"
import express from "express"
const app = express()
app.get('/api/express', function (req, res) {
return res.send('root')
})
app.get('/api/express/greet', function (req, res) {
return res.send('hello world')
})
const handler: NextApiHandler = async (req, res) => {
app(req, res)
}
export default handler
今回はわかりやすくexpress
でやってみたが、node標準のhttp APIなど、RequestがIncomingMessageでResponseがOutgoingMessageであるものならある程度使えるはずだ。
ちなみにこれはnext@12の_middleware
で出来ないか?みたいなことを考えてやっていたが、そちらはEdge Runtimeというサンドボックスな環境で動いており、fs
等が使えないので動かすことは出来ない模様だった。
Discussion