6

我正在使用 Next.js v9,并希望通过将我的应用程序与 Cloudflare Workers 一起使用来利用 Next 的无服务器部署选项。

从 Next.js 文档中,我知道 Next 创建的每个无服务器函数都具有以下签名:

export function render(req: http.IncomingMessage, res: http.ServerResponse) => void

当使用 Node 的http.Server类(express例如使用)时,传入reqandres对象变得微不足道,并且在文档中显示了一个示例。

但是,问题在于 Cloudflare Workers 使用的对象RequestResponseNext 预期的不同。他们的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对象。有什么想法吗?

谢谢

4

2 回答 2

5

您的目标是复制Node.jshttp模块的 API,该模块提供http.IncomingMessagehttp.ServerResponse. 这似乎是一项艰巨的任务,在某些方面违背了使用以 Service Worker API 为模型的 Cloudflare Workers 的目的。相反,请考虑放弃 Next.js,以使用 Cloudflare Workers 特定的方法来使用 React 的 SSR,正如 Cloudflare在此处演示的那样。

于 2019-12-02T06:19:20.227 回答
1

您可以尝试像这样模仿响应对象。

        const page = require('./.next/serverless/pages/some_page.js');

        addEventListener('fetch', event => {
            event.respondWith(handleRequest(event.request))
        })

        async function handleRequest(request) {
            return new Promise((resolve) => {
                const response = {
                    setHeader: () => {},
                    getHeader: () => {},
                    end: (htmlString) => {
                        resolve(htmlString);
                    },
                };
                page.render(request, response);
            });
        }
于 2019-12-10T13:26:49.743 回答