我正在使用 Next.js v9,并希望通过将我的应用程序与 Cloudflare Workers 一起使用来利用 Next 的无服务器部署选项。
从 Next.js 文档中,我知道 Next 创建的每个无服务器函数都具有以下签名:
export function render(req: http.IncomingMessage, res: http.ServerResponse) => void
当使用 Node 的http.Server
类(express
例如使用)时,传入req
andres
对象变得微不足道,并且在文档中显示了一个示例。
但是,问题在于 Cloudflare Workers 使用的对象Request
与Response
Next 预期的不同。他们的Request
对象的文档可以在这里找到,他们的对象的文档Response
可以在这里找到。
因此,虽然在 Cloudflare Workers 上运行的简单“hello world”应用程序看起来像这样:
// 1. Register a FetchEvent listener that sends a custom
// response for the given request.
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
// 2. Return a custom request object
async function handleRequest(request) {
return new Response('hello world')
}
并呈现一个简单的 Next.js 函数可能看起来像这样:
const page = require('./.next/serverless/pages/some_page.js');
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
return page.render(request, new Response());
}
resuest 和 response 类型之间存在固有的不匹配,因此我怀疑会引发错误。
我知道我需要修改这些,以便它们按照 Next.js 的预期传递。我知道Request
可以修改 Worker 的对象,如此处所示。但我不确定如何使其与http.IncomingMessage
对象完全匹配。而且我也不确定如何格式化Response
对象。有什么想法吗?
谢谢