Skip to content

Latest commit

 

History

History
97 lines (66 loc) · 2.89 KB

README.md

File metadata and controls

97 lines (66 loc) · 2.89 KB

Build Status npm version semantic-release

Async middleware for node-fetch

Elegant asynchronous middleware chaining around node-fetch calls. Yes, kind of yet another one. Motivation behind this started with deprecation of request and looking at alternatives I just couldn't find a plugin system that was reasonable.

A middleware is a function that accepts the first two arguments of fetch - url and init and a wrapped function for the next middleware call which itself has identical API as original fetch, and returns a promise of a Response, same as fetch. Middleware has an opportunity to modify or replace request arguments and the response. Here's a middleware:

const mw = async (url, init, next) => {
  // ... do anything you want with url and init
  const response = await next(url, init)
  // ... do whatever you want with response
  return response
}

and you can use it like this:

mw('https://www.google.com', null, fetch)

compose

Main tool shipped in this library is compose which chains multiple middleware together:

const {compose} = require('node-fetch-middleware')

const fetch = compose([mw1, mw2])

fetch('https://www.google.com').then(console.log) // compose will tack on the last fetch for you

I'm also shipping several middleware I find useful with this library:

json

Allows structured json request body and parses json output.

const {compose, json} = require('node-fetch-middleware')

compose([json])('http://localhost:8080/myapi', {
  method: 'POST', json: {foo: 'bar'}
}).then(response => console.log(response.parsed))

query

Structured query string dubiously missing from fetch.

compose([query])('http://localhost:8080/myapi', {query: {foo: 'bar'}})

reject

Throw exception on an unexpected response.

compose([reject(/* Can provide own test, default will throw for status >= 400 */)])('https://nowhere')

prefix

Prefix all request urls.

compose([prefix('https://www.google.com', /* Other options */)])('/foo')

bearer

Attach a bearer token to requests, allows for asynchronous provider

compose([bearer({provider: async () => 'token'})])('https://localhost:8080/myapi')

cache

Cache responses. Factory defaults will cache GET, HEAD, and OPTIONS responses with status codes under 400 for 30 seconds. See options for possibilities.

compose([cache()])('https://www.google.com')