Мне интересно, возможен ли следующий сценарий с бессерверным (развернутым на Vercel) Next JS:
У меня есть маршрут /product/[id].tsx
, когда вы отправляете запрос с заголовком Accept: text/html
, Я бы хотел, чтобы go проходил через обычный поток Next JS со страницей React. Но когда запрос передается с Accept: application/json
, я хотел бы, чтобы он возвращал представление JSON.
Я выполнил это с помощью некоторого специального промежуточного программного обеспечения, которое я написал для Express (см. Ниже), но я также хотел бы развернуть его на Vercel, а Vercel не предназначен для работы с пользовательской реализацией Express.
Итак, вопрос в том, можно ли это сделать в бессерверной среде? Может ли одна из страниц Next JS React возвращать чистый JSON, или вы можете вернуть React из маршрута Next JS Api? Или есть другой способ выполнить sh это?
server.ts
import express, { Request, Response } from "express";
import next from 'next'
import { parse } from 'url'
const port = parseInt(process.env.PORT || "3000", 10);
const dev = process.env.NODE_ENV !== "production";
async function run(): Promise<void> {
const app = express();
const nextApp = next({ dev })
const nextHandler = nextApp.getRequestHandler()
await nextApp.prepare()
app.use((req, res) => {
res.format({
"text/html": async (req, res) => {
const parsedUrl = parse(req.url!, true)
await this.handler(req, res, parsedUrl)
},
"application/json": async (req, res) => {
res.json({
"dummy": "data"
})
}
})
});
app.listen(port, () => {
console.log(
`> Server listening at http://localhost:${port} as ${
dev ? "development" : process.env.NODE_ENV
}`
);
});
}
run()