ContentTypeParser | Fastify (2024)

Table of Contents
Content-Type Parser​ Usage​

Content-Type Parser

Natively, Fastify only supports 'application/json' and 'text/plain' contenttypes. If the content type is not one of these, anFST_ERR_CTP_INVALID_MEDIA_TYPE error will be thrown.Other common content types are supported through the use ofplugins.

The default charset is utf-8. If you need to support different content types,you can use the addContentTypeParser API. The default JSON and/or plain textparser can be changed or removed.

Note: If you decide to specify your own content type with the Content-Typeheader, UTF-8 will not be the default. Be sure to include UTF-8 like thistext/html; charset=utf-8.

As with the other APIs, addContentTypeParser is encapsulated in the scope inwhich it is declared. This means that if you declare it in the root scope itwill be available everywhere, while if you declare it inside a plugin it will beavailable only in that scope and its children.

Fastify automatically adds the parsed request payload to the Fastifyrequest object which you can access with request.body.

Note that for GET and HEAD requests the payload is never parsed. ForOPTIONS and DELETE requests the payload is only parsed if the content typeis given in the content-type header. If it is not given, thecatch-all parser is not executed as with POST, PUT andPATCH, but the payload is simply not parsed.

Usage

fastify.addContentTypeParser('application/jsoff', function (request, payload, done) {
jsoffParser(payload, function (err, body) {
done(err, body)
})
})

// Handle multiple content types with the same function
fastify.addContentTypeParser(['text/xml', 'application/xml'], function (request, payload, done) {
xmlParser(payload, function (err, body) {
done(err, body)
})
})

// Async is also supported in Node versions >= 8.0.0
fastify.addContentTypeParser('application/jsoff', async function (request, payload) {
var res = await jsoffParserAsync(payload)

return res
})

// Handle all content types that matches RegExp
fastify.addContentTypeParser(/^image\/.*/, function (request, payload, done) {
imageParser(payload, function (err, body) {
done(err, body)
})
})

// Can use default JSON/Text parser for different content Types
fastify.addContentTypeParser('text/json', { parseAs: 'string' }, fastify.getDefaultJsonParser('ignore', 'ignore'))

Fastify first tries to match a content-type parser with a string value beforetrying to find a matching RegExp. If you provide overlapping content types,Fastify tries to find a matching content type by starting with the last onepassed and ending with the first one. So if you want to specify a generalcontent type more precisely, first specify the general content type and then themore specific one, like in the example below.

// Here only the second content type parser is called because its value also matches the first one
fastify.addContentTypeParser('application/vnd.custom+xml', (request, body, done) => {} )
fastify.addContentTypeParser('application/vnd.custom', (request, body, done) => {} )

// Here the desired behavior is achieved because fastify first tries to match the
// `application/vnd.custom+xml` content type parser
fastify.addContentTypeParser('application/vnd.custom', (request, body, done) => {} )
fastify.addContentTypeParser('application/vnd.custom+xml', (request, body, done) => {} )

Besides the addContentTypeParser API there are further APIs that can be used.These are hasContentTypeParser, removeContentTypeParser andremoveAllContentTypeParsers.

hasContentTypeParser

You can use the hasContentTypeParser API to find if a specific content typeparser already exists.

if (!fastify.hasContentTypeParser('application/jsoff')){
fastify.addContentTypeParser('application/jsoff', function (request, payload, done) {
jsoffParser(payload, function (err, body) {
done(err, body)
})
})
}

removeContentTypeParser

With removeContentTypeParser a single or an array of content types can beremoved. The method supports string and RegExp content types.

fastify.addContentTypeParser('text/xml', function (request, payload, done) {
xmlParser(payload, function (err, body) {
done(err, body)
})
})

// Removes the both built-in content type parsers so that only the content type parser for text/html is available
fastify.removeContentTypeParser(['application/json', 'text/plain'])

removeAllContentTypeParsers

In the example from just above, it is noticeable that we need to specify eachcontent type that we want to remove. To solve this problem Fastify provides theremoveAllContentTypeParsers API. This can be used to remove all currentlyexisting content type parsers. In the example below we achieve the same as inthe example above except that we do not need to specify each content type todelete. Just like removeContentTypeParser, this API supports encapsulation.The API is especially useful if you want to register a catch-all content typeparser that should be executed for every content type and thebuilt-in parsers should be ignored as well.

fastify.removeAllContentTypeParsers()

fastify.addContentTypeParser('text/xml', function (request, payload, done) {
xmlParser(payload, function (err, body) {
done(err, body)
})
})

Notice: The old syntaxes function(req, done) and async function(req) forthe parser are still supported but they are deprecated.

Body Parser

You can parse the body of a request in two ways. The first one is shown above:you add a custom content type parser and handle the request stream. In thesecond one, you should pass a parseAs option to the addContentTypeParserAPI, where you declare how you want to get the body. It could be of type'string' or 'buffer'. If you use the parseAs option, Fastify willinternally handle the stream and perform some checks, such as the maximumsize of the body and the content length. If thelimit is exceeded the custom parser will not be invoked.

fastify.addContentTypeParser('application/json', { parseAs: 'string' }, function (req, body, done) {
try {
var json = JSON.parse(body)
done(null, json)
} catch (err) {
err.statusCode = 400
done(err, undefined)
}
})

Seeexample/parser.jsfor an example.

Custom Parser Options
  • parseAs (string): Either 'string' or 'buffer' to designate how theincoming data should be collected. Default: 'buffer'.
  • bodyLimit (number): The maximum payload size, in bytes, that the customparser will accept. Defaults to the global body limit passed to the Fastifyfactory function.

Catch-All

There are some cases where you need to catch all requests regardless of theircontent type. With Fastify, you can just use the '*' content type.

fastify.addContentTypeParser('*', function (request, payload, done) {
var data = ''
payload.on('data', chunk => { data += chunk })
payload.on('end', () => {
done(null, data)
})
})

Using this, all requests that do not have a corresponding content type parserwill be handled by the specified function.

This is also useful for piping the request stream. You can define a contentparser like:

fastify.addContentTypeParser('*', function (request, payload, done) {
done()
})

and then access the core HTTP request directly for piping it where you want:

app.post('/hello', (request, reply) => {
reply.send(request.raw)
})

Here is a complete example that logs incoming jsonline objects:

const split2 = require('split2')
const pump = require('pump')

fastify.addContentTypeParser('*', (request, payload, done) => {
done(null, pump(payload, split2(JSON.parse)))
})

fastify.route({
method: 'POST',
url: '/api/log/jsons',
handler: (req, res) => {
req.body.on('data', d => console.log(d)) // log every incoming object
}
})

For piping file uploads you may want to check out thisplugin.

If you want the content type parser to be executed on all content types and notonly on those that don't have a specific one, you should call theremoveAllContentTypeParsers method first.

// Without this call, the request body with the content type application/json would be processed by the built-in JSON parser
fastify.removeAllContentTypeParsers()

fastify.addContentTypeParser('*', function (request, payload, done) {
var data = ''
payload.on('data', chunk => { data += chunk })
payload.on('end', () => {
done(null, data)
})
})
ContentTypeParser | Fastify (2024)
Top Articles
Nyx: Greek Goddess of the Night | History Cooperative
Bonus Depreciation vs Section 179 - HBK
3 Tick Granite Osrs
What spices do Germans cook with?
Danatar Gym
What to Do For Dog Upset Stomach
Nyu Paralegal Program
Body Rubs Austin Texas
Craigslist Motorcycles Jacksonville Florida
Sam's Club Gas Price Hilliard
ds. J.C. van Trigt - Lukas 23:42-43 - Preekaantekeningen
414-290-5379
Gt Transfer Equivalency
What is the surrender charge on life insurance?
Raid Guides - Hardstuck
Hssn Broadcasts
Cvs Learnet Modules
Seafood Bucket Cajun Style Seafood Restaurant in South Salt Lake - Restaurant menu and reviews
Cpt 90677 Reimbursem*nt 2023
Q Management Inc
Wausau Obits Legacy
Testberichte zu E-Bikes & Fahrrädern von PROPHETE.
Tinker Repo
Walmart Near South Lake Tahoe Ca
Is Windbound Multiplayer
Www.patientnotebook/Atic
Talk To Me Showtimes Near Marcus Valley Grand Cinema
Skycurve Replacement Mat
Helpers Needed At Once Bug Fables
Marilyn Seipt Obituary
Leben in Japan – das muss man wissen - Lernen Sie Sprachen online bei italki
Valley Craigslist
Busted! 29 New Arrests in Portsmouth, Ohio – 03/27/22 Scioto County Mugshots
Khatrimmaza
Ellafeet.official
Pnc Bank Routing Number Cincinnati
Lehpiht Shop
Orangetheory Northville Michigan
Dr Adj Redist Cadv Prin Amex Charge
Lake Kingdom Moon 31
Bob And Jeff's Monticello Fl
At Home Hourly Pay
Rage Of Harrogath Bugged
Blue Beetle Showtimes Near Regal Evergreen Parkway & Rpx
Avance Primary Care Morrisville
Mountainstar Mychart Login
Meet Robert Oppenheimer, the destroyer of worlds
25 Hotels TRULY CLOSEST to Woollett Aquatics Center, Irvine, CA
Benjamin Franklin - Printer, Junto, Experiments on Electricity
Stoughton Commuter Rail Schedule
Enter The Gungeon Gunther
Lux Nails & Spa
Latest Posts
Article information

Author: Otha Schamberger

Last Updated:

Views: 5822

Rating: 4.4 / 5 (55 voted)

Reviews: 94% of readers found this page helpful

Author information

Name: Otha Schamberger

Birthday: 1999-08-15

Address: Suite 490 606 Hammes Ferry, Carterhaven, IL 62290

Phone: +8557035444877

Job: Forward IT Agent

Hobby: Fishing, Flying, Jewelry making, Digital arts, Sand art, Parkour, tabletop games

Introduction: My name is Otha Schamberger, I am a vast, good, healthy, cheerful, energetic, gorgeous, magnificent person who loves writing and wants to share my knowledge and understanding with you.