🚄

nextjsのAPIでExpress呼び出す

2021/11/14に公開

nextからexpressのインスタンスを噛ませて呼び出せる小ネタを見つけたのでメモ。

ほとんど使うこと無いと思われるが、何らかの理由で外部のアプリケーションを呼び出したいケースはありそう

やり方

すべてのルーティングを受けたいので、/api/express/[[...props]].tsなどcatch allなルーティングにする。

あとはexpressでインスタンスを生成し、handlerで受け取るreqresをそのまま渡す。

// /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等が使えないので動かすことは出来ない模様だった。

GitHubで編集を提案

Discussion