A library providing Node.js-compatible request and response objects for WinterTC (fetch
-like) runtimes,
such as Cloudflare Workers, Bun, Deno and Fastly Compute.
Useful for when you're using a Node.js library in one of these environments that expects Node.js-style req
and res
objects,
for example Express.
This is basically the inverse of libraries like @mjackson/node-fetch-server
that allow the use of Request
/Response
signatures in Node.js servers.
This library is a copy/fork of Katsuyuki Omuro's great @fastly/http-compute-js project and wouldn't be possible without the hard work put in there. The changes here were largely made to remove dependencies and make the interfaces more generic.
That said, this library does depend on a certain level of Node.js compatibility (Readable
, Writable
from node:stream
and Buffer
from node:buffer
).
So please check out @fastly/http-compute-js if this library doesn't work for you.
import { toReqRes, toFetchResponse } from "fetch-to-node";
export default {
async fetch(request: Request): Promise<Response> {
// Create Node.js-compatible req and res from request
const { req, res } = toReqRes(request);
// Use req/res as you would in a Node.js application
res.writeHead(200, { "Content-Type": "application/json" });
res.end(
JSON.stringify({
data: "Hello World!",
})
);
// Create a Response object based on res, and return it
return await toFetchResponse(res);
},
};
NB: If you're using Cloudflare Workers, be sure to set the nodejs_compat
flag.
req
and res
are implementations of IncomingMessage
and
ServerResponse
, respectively, and
can be used as in a Node.js program.
toReqRes(request)
- Converts from a
Request
object to a pair of Node.js-compatible request and response objects. - Parameters:
request
- ARequest
object. You would typically obtain this from therequest
received by yourfetch
handler.
- Returns: an object with the following properties.
req
- Anhttp.IncomingMessage
object whoseReadable
interface has been wired to theRequest
object'sbody
. NOTE: This is an error if theRequest
'sbody
has already been used.res
- Anhttp.ServerResponse
object whoseWritable
interface has been wired to an in-memory buffer.
toFetchResponse(res)
- Creates a new
Response
object from theres
object above, based on the status code, headers, and body that has been written to it. - Parameters:
res
- Anhttp.ServerResponse
object created bytoReqRes()
.
- Returns: a promise that resolves to a
Response
object. - NOTE: This function returns a
Promise
that resolves to aResponse
once theres
object emits the'finish'
event, which typically happens when you callres.end()
. If your application never signals the end of output, this promise will never resolve, and your application will likely error or time out. - If an error occurs, the promise will reject with that error.
- HTTP Version is currently always reported as
1.1
. - The
socket
property of these objects is alwaysnull
, and cannot be assigned. - The
ServerResponse
write stream must be finished before theResponse
object is generated. - Trailers are not supported, as there's no support for these in the fetch API.
- Client APIs not supported:
http.Agent
,http.ClientRequest
,http.get()
,http.request()
, to name a few.
MIT.
In order for this library to function without requiring a direct dependency on Node.js itself, portions of the code in this library are adapted / copied from Node.js. Those portions are Copyright Joyent, Inc. and other Node contributors. See the LICENSE file for details.