1 | # Middy http-response-serializer middleware
|
2 |
|
3 | <div align="center">
|
4 | <img alt="Middy logo" src="https://raw.githubusercontent.com/middyjs/middy/main/docs/img/middy-logo.png"/>
|
5 | </div>
|
6 |
|
7 | <div align="center">
|
8 | <p><strong>HTTP response serializer middleware for the middy framework, the stylish Node.js middleware engine for AWS Lambda</strong></p>
|
9 | </div>
|
10 |
|
11 | <div align="center">
|
12 | <p>
|
13 | <a href="http://badge.fury.io/js/%40middy%2Fhttp-response-serializer">
|
14 | <img src="https://badge.fury.io/js/%40middy%2Fhttp-response-serializer.svg" alt="npm version" style="max-width:100%;">
|
15 | </a>
|
16 | <a href="https://snyk.io/test/github/middyjs/middy">
|
17 | <img src="https://snyk.io/test/github/middyjs/middy/badge.svg" alt="Known Vulnerabilities" data-canonical-src="https://snyk.io/test/github/middyjs/middy" style="max-width:100%;">
|
18 | </a>
|
19 | <a href="https://standardjs.com/">
|
20 | <img src="https://img.shields.io/badge/code_style-standard-brightgreen.svg" alt="Standard Code Style" style="max-width:100%;">
|
21 | </a>
|
22 | <a href="https://gitter.im/middyjs/Lobby">
|
23 | <img src="https://badges.gitter.im/gitterHQ/gitter.svg" alt="Chat on Gitter" style="max-width:100%;">
|
24 | </a>
|
25 | </p>
|
26 | </div>
|
27 |
|
28 | The Http Serializer middleware lets you define serialization mechanisms based on the current content negotiation.
|
29 |
|
30 |
|
31 | ## Install
|
32 |
|
33 | To install this middleware you can use NPM:
|
34 |
|
35 | ```bash
|
36 | npm install --save @middy/http-response-serializer
|
37 | ```
|
38 |
|
39 |
|
40 | ## Configuration
|
41 |
|
42 | The middleware is configured by defining some `serializers`.
|
43 |
|
44 | ```
|
45 | {
|
46 | serializers: [
|
47 | {
|
48 | regex: /^application\/xml$/,
|
49 | serializer: ({ body }) => `<message>${body}</message>`,
|
50 | },
|
51 | {
|
52 | regex: /^application\/json$/,
|
53 | serializer: ({ body }) => JSON.stringify(body)
|
54 | },
|
55 | {
|
56 | regex: /^text\/plain$/,
|
57 | serializer: ({ body }) => body
|
58 | }
|
59 | ],
|
60 | default: 'application/json'
|
61 | }
|
62 | ```
|
63 |
|
64 | The `default` (optional) option is used if the request and handler don't specify what type is wanted.
|
65 |
|
66 |
|
67 | ## Serializer Functions
|
68 |
|
69 | When a matching serializer is found, the `Content-Type` header is set and the serializer function is run.
|
70 |
|
71 | The function is passed the entire `response` object, and should return either a string or an object.
|
72 |
|
73 | If a string is returned, the `body` attribute of the response is updated.
|
74 |
|
75 | If an object with a `body` attribute is returned, the entire response object is replaced. This is useful if you want to manipulate headers or add additional attributes in the Lambda response.
|
76 |
|
77 |
|
78 | ## Content Type Negotiation
|
79 |
|
80 | The header is not the only way the middleware decides which serializer to execute.
|
81 |
|
82 | The content type is determined in the following order:
|
83 |
|
84 | * `event.requiredContentType` -- allows the handler to override everything else
|
85 | * The `Accept` header via [accept](https://www.npmjs.com/package/accept)
|
86 | * `event.preferredContentType` -- allows the handler to override the default, but lets the request ask first
|
87 | * `default` middleware configuration
|
88 |
|
89 | All options allow for multiple types to be specified in your order of preference, and the first matching serializer will be executed.
|
90 |
|
91 |
|
92 | ## Sample usage
|
93 |
|
94 | ```javascript
|
95 | import middy from '@middy/core'
|
96 | import httpResponseSerializer from '@middy/http-response-serializer'
|
97 |
|
98 | const handler = middy((event, context) => {
|
99 | const body = 'Hello World'
|
100 |
|
101 | return cb(null, {
|
102 | statusCode: 200,
|
103 | body
|
104 | })
|
105 | })
|
106 |
|
107 | handler
|
108 | .use(httpResponseSerializer({
|
109 | serializers: [
|
110 | {
|
111 | regex: /^application\/xml$/,
|
112 | serializer: ({ body }) => `<message>${body}</message>`,
|
113 | },
|
114 | {
|
115 | regex: /^application\/json$/,
|
116 | serializer: ({ body }) => JSON.stringify(body)
|
117 | },
|
118 | {
|
119 | regex: /^text\/plain$/,
|
120 | serializer: ({ body }) => body
|
121 | }
|
122 | ],
|
123 | default: 'application/json'
|
124 | }))
|
125 |
|
126 | const event = {
|
127 | headers: {
|
128 | 'Accept': 'application/xml;q=0.9, text/x-dvi; q=0.8, text/x-c'
|
129 | }
|
130 | }
|
131 |
|
132 | handler(event, {}, (_, response) => {
|
133 | t.is(response.body,'<message>Hello World</message>')
|
134 | })
|
135 | ```
|
136 |
|
137 |
|
138 | ## Middy documentation and examples
|
139 |
|
140 | For more documentation and examples, refers to the main [Middy monorepo on GitHub](https://github.com/middyjs/middy) or [Middy official website](https://middy.js.org).
|
141 |
|
142 |
|
143 | ## Contributing
|
144 |
|
145 | Everyone is very welcome to contribute to this repository. Feel free to [raise issues](https://github.com/middyjs/middy/issues) or to [submit Pull Requests](https://github.com/middyjs/middy/pulls).
|
146 |
|
147 |
|
148 | ## License
|
149 |
|
150 | Licensed under [MIT License](LICENSE). Copyright (c) 2017-2021 Luciano Mammino, will Farrell, and the [Middy team](https://github.com/middyjs/middy/graphs/contributors).
|
151 |
|
152 | <a href="https://app.fossa.io/projects/git%2Bgithub.com%2Fmiddyjs%2Fmiddy?ref=badge_large">
|
153 | <img src="https://app.fossa.io/api/projects/git%2Bgithub.com%2Fmiddyjs%2Fmiddy.svg?type=large" alt="FOSSA Status" style="max-width:100%;">
|
154 | </a>
|