Quality of life improvements for zlFetch


I silently updated zlFetch a couple of months ago with some improvements that make coding much easier — especially if you’re using zlFetch in Node.

What is zlFetch?

Just in case you don’t know about it, zlFetch is a wrapper over the native Fetch API. I’ve built zlFetch because I wanted to make it easier to use the Fetch API.

Now without further ado, let me talk about the quality of life improvements I’ve made recently.

Returning errors

zlFetch was built to catch and throw HTTP errors, so zlFetch is promise-friendly.

  .then(/* do something when successful */)
  .catch(/* throw an error when unsuccessful */)

Although this pattern follows the promise spec, it can be very unwieldy when used in an async function. Typically, if you want to handle an error, you have to use a try/catchpattern.

try {
  const response = await zlFetch('some-url')
  // Do something with the response
} catch (error) {
  // Do something with the error

I didn’t like this so I added a returnError property to zlFetch. This allows you to return the error message instead of throwing it.

Then you can use a standard if/else conditionals to write your Fetch requests.

const { response, error } = await zlFetch('some-url', {
  returnError: true

if (response) // Do something with response
if (error) // Do something with error

You can make it even easier by creating an instance of zlFetch with the options you want to use. More on this later.

Debug Mode

zlFetch now contains a debug mode.

This lets you know exactly what you’re sending in your request — so you don’t have to check the Network Panel to know what you sent over.

Just add the debug mode and you can log what you’re sending over.

const { response, debug } = await zlFetch(
    query: { per_page: 100 },
    debug: true,

Console log that shows the url, headers, method, and request body that is sent out to the server.

Creating a zlFetch Instance

It’s now possible to create a zlFetch instance that contains the options you wish to use.

You can attach a base URL you wish to use over a couple of APIs…

import { createZlFetch } from 'zl-fetch'

// Create the instance
const api = createZlFetch('https://your-api.com/api/v1')

// Using the instance
const response = await api.post('users', {
  body: {
    firstName: 'Zell',
    lastName: 'Liew',
    email: '[email protected]',

…attach options you typically use…

import { createZlFetch } from 'zl-fetch'

// Create the instance
const api = createZlFetch({ returnError: true })

// Using the instance
const { response, error } = await api.post(/* ... */)

… or both!

import { createZlFetch } from 'zl-fetch'

// Create the instance
const api = createZlFetch('https://your-api.com/api/v1', {
  returnError: true,

// Using the instance
const { response, error } = await api.post('users', {
  body: {
    firstName: 'Zell',
    lastName: 'Liew',
    email: '[email protected]',

This feature helps a lot when you have to send many fetch requests in the same file.

One great example is if you create a file to house all requests to a particular API.

Another great example is when you have to send many requests when you test your APIs. (I cover this in more detail in my Node Workshop).

Removing node-fetch as a dependency.

We have removed the node-fetch dependency in v6.0.0 since Node v17 contains the Fetch API.

You will still be able to use zlFetch as normal — nothing will change — if you’re using Node v17 and above.

If you’re using a legacy version of Node, we’ll need you to import node-fetch into your project before using zlFetch.

That’s it for today!

There are a few more qualify of life improvements that I’ve made, but I think this is big enough of an announcement today.

I’ll talk about other features in another newsletter to come.

Want to become a better Frontend Developer?

Don’t worry about where to start. I’ll send you a library of articles frontend developers have found useful!

  • 60+ CSS articles
  • 90+ JavaScript articles

I’ll also send you one article every week to help you improve your FED skills crazy fast!