Skip to content

Elegant asynchronous middleware chaining around node-fetch calls

License

Notifications You must be signed in to change notification settings

lev-kuznetsov/node-fetch-middleware

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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')

About

Elegant asynchronous middleware chaining around node-fetch calls

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •