Skip to content
Fetch API polyfill and facade. Its request and response wrappers can be used separately: use fetch for request yet get back Node's Http.get response (IncomingMessage) for streaming.
JavaScript Makefile
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


NPM version Build status

Fetch/Off.js is a Fetch API polyfill and facade for Node.js. That is, it allows you to use the Fetch interface you might be familiar with in the browser to make web requests from Node.js, getting back either a Fetch compatible Response object or Node.js's own IncomingMessage (like you would from vanilla Http.get()). In the latter respect it's a unique polyfill library — you have an option to use Fetch for requests, but still get the full streaming power of Node.js's responses.

Fetch/Off.js doesn't yet fully match the living Fetch API — it's missing redirect support for example — but for the common case it's sufficient.


npm install fetch-off

Fetch/Off.js follows semantic versioning, so feel free to depend on its major version with something like >= 1.0.0 < 2 (a.k.a ^1.0.0).


Fetch Compatible Request and Response

By default requiring Fetch/Off.js will give you a Fetch compatible function that takes fetch's url and options arguments and resolves with an equally compatible Fetch's Response:

var fetch = require("fetch-off")

var res = fetch("")

res.then(function(res) {
  res.text().then(function(body) {
    console.log(res.status, body)

As with the Fetch API, pass method to options to make POST requests:

var res = fetch("", {
  method: "POST",
  headers: {"Content-Type": "application/json"},
  body: JSON.stringify({name: "John"})

res.then(function(res) {
  res.text().then(function(body) {
    console.log(res.status, body)

If you'd like to automate serializing objects to JSON or HTML forms, please see:

Those modules work perfectly with Fetch/Off.js's implementation.

Fetch Compatible Request with Node's Response

Requiring Fetch/Off.js's request file will give you a Fetch API compatible request function that takes fetch's url and options arguments. It resolves with the vanilla Node's response object (IncomingMessage) as you would get from Http.get:

var request = require("fetch-off/request")

var res = request("")

res.then(function(res) {
  console.log(res.statusCode, res.statusMessage)

In that way it's a very lightweight alternative to Mikael's request module.

Fetch Compatible Response with Node's Request

If you have some code or middleware that works only with Fetch API Response objects, yet you make requests yourself, pass the Node.js's IncomingMessage object to FetchOff's Response:

var Http = require("http")
var Response = require("fetch-off/response")

var res = new Response(Http.get(""))

res.then(function(res) {
  res.text().then(function(body) {
    console.log(res.status, body)


Fetch/Off.js is released under a Lesser GNU Affero General Public License, which in summary means:

  • You can use this program for no cost.
  • You can use this program for both personal and commercial reasons.
  • You do not have to share your own program's code which uses this program.
  • You have to share modifications (e.g. bug-fixes) you've made to this program.

For more convoluted language, see the LICENSE file.


Andri Möll typed this and the code.
Monday Calendar supported the engineering work.

If you find Fetch/Off.js needs improving, please don't hesitate to type to me now at or create an issue online.

You can’t perform that action at this time.