# fastify-raw-body

[![ci](https://github.com/Eomm/fastify-raw-body/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/Eomm/fastify-raw-body/actions/workflows/ci.yml)
[![npm](https://img.shields.io/npm/v/fastify-raw-body)](https://www.npmjs.com/package/fastify-raw-body)
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)

Adds the raw body to the Fastify request object.

## Install

```
npm i fastify-raw-body
```

### Compatibility

| Plugin version | Fastify version |
| ------------- |:---------------:|
| `^6.0.0` | `^5.0.0` |
| `^5.0.0` | `^5.0.0` |
| `^4.2.1` | `^4.19.0` |
| `^4.0.0` | `^4.0.0` |
| `^3.0.0` | `^3.0.0` |
| `^2.0.0` | `^2.0.0` |


## Usage

This plugin will add the `request.rawBody`.  
It will get the data using the [`preParsing`](https://www.fastify.io/docs/latest/Reference/Hooks/#preparsing) hook.

```js
import Fastify from 'fastify'

const app = Fastify()
await app.register(import('fastify-raw-body'), {
  field: 'rawBody', // change the default request.rawBody property name
  global: false, // add the rawBody to every request. **Default true**
  encoding: 'utf8', // set it to false to set rawBody as a Buffer **Default utf8**
  runFirst: true, // get the body before any preParsing hook change/uncompress it. **Default false**
  routes: [], // array of routes, **`global`** will be ignored, wildcard routes not supported
  jsonContentTypes: [], // array of content-types to handle as JSON. **Default ['application/json']**
})

app.post('/', {
  config: {
    // add the rawBody to this route. if false, rawBody will be disabled when global is true
    rawBody: true
  },
  handler (req, reply) {
    // req.rawBody the string raw body
    reply.send(req.rawBody)
  }
})
```

> **Note**  
> You need to `await` the plugin registration to make sure the plugin is ready to use.
> All the routes defined **before** the plugin registration will be ignored.
> This change has been introduced in Fastify v4.

> **Warning**  
> Setting `global: false` and then the route configuration `{ config: { rawBody: true } }` will
> save memory of your server since the `rawBody` is a copy of the `body` and it will double the memory usage.  
> So use it only for the routes that you need to.

### Raw body as Buffer

It is important to know that setting `encoding: false` will run [`addContentTypeParser`](https://www.fastify.io/docs/master/ContentTypeParser/) to add a content type parser for `application/json`.

This is needed since the default content type parser will set the encoding of the request stream to `{ parseAs: 'string' }`.

If you haven't customized this component, it will be secure as the original one since [`secure-json-parse`](https://www.npmjs.com/package/secure-json-parse) is used under the hood.

## License

Copyright [Manuel Spigolon](https://github.com/Eomm), Licensed under [MIT](./LICENSE).
