Fetch API has finally landed Node v18.0
Tags: javascript, node, webdev, programming
Published: 2022-05-25 15:23:08

This is exciting news for Javascript developers, we can now use Fetch API in our Node application without the need of any libraries. Previously we needed to add additional packages like **node-fetch** or **axios** but we no longer need them anymore.

## What is Fetch API?

The [fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) is a standard way of making web API HTTP requests. It’s a promise based which supports many high-level HTTP features, while also focusing on the most common scenario: sending simple HTTP requests. 

Under the hood the API it comprises of are

**fetch()**  entry point to initiate requests

**Headers**  Represents response/request headers, allowing you to query them and take different actions depending on the results.

**Request**  Represents a resource request.

**Response**   Represents the response to a request.

Fetch API generally does work in browsers but now it does work in Node servers as well. We wont be needing any dependency as Node.js core will now support the API. 

When the Fetch API is enabled, the following global functions and classes are made available: [fetch()](https://nodejs.org/api/globals.html#fetch), [Request](https://nodejs.org/api/globals.html#request), [Response](https://nodejs.org/api/globals.html#response), [Headers](https://nodejs.org/api/globals.html#class-headers), [FormData](https://nodejs.org/api/globals.html#class-formdata)

## Fetch implementation

> Please make sure that you do have node version greater than v18.0 installed in your machine. Run the command node -v in your console to see which version you have running. If its less than 18 then you need to upgrade before you can use these new features.

We will implement three major request GET, POST, DELETE.


**GET request**

```javascript
const getMethod = async () => {
  const res = await fetch('https://jsonplaceholder.typicode.com/posts');
  if (res.ok) {
      const data = await res.json();
      console.log(data);
  }
};

getMethod();
```

**POST request**

```javascript
  const postMethod = async () => {
    const data = {
      title: 'I love Node.js',
      body: 'Node.js is a JavaScript runtime built on Chrome\'s V8 JavaScript engine.',
      userId: 1,
    };
    const res = await fetch("https://jsonplaceholder.typicode.com/posts", {
        method: 'POST', // *GET, POST, PUT, DELETE, etc.
        mode: 'cors', // no-cors, *cors, same-origin
        cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
        credentials: 'same-origin', // include, *same-origin, omit
        headers: {
          'Content-type': 'application/json; charset=UTF-8',
            // 'Content-Type': 'application/x-www-form-urlencoded',
        },
        redirect: 'follow', // manual, *follow, error
        referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
        body: JSON.stringify(data) // body data type must match "Content-Type" header
        
    });
    await res.json();
};

postMethod();
```

**DELETE request**

```javascript
const deleteMethod = async () => {
  const res = await fetch("https://jsonplaceholder.typicode.com/posts/1", {
      method: 'DELETE'
});
console.log(res);
};

deleteMethod();
```

##Conclusion

We implemented fetch API operation with Node without the need for any library imports. The thing to note that under the hood that the fetch implementation is done based on another HTTP client, [undici](https://github.com/nodejs/undici), which is actually a HTTP client written specifically for Node.js. It is an HTTP 1.1 only client.

This is a small improvement in the framework but brings a lot of joy for us developers. We just covered an introduction to Node.js 18 Fetch API. You can further dig deeper into this in official Node documentation [here](https://nodejs.org/en/blog/announcements/v18-release-announce/).

Happy coding!