express-fastify-runtime 0.1.0 β 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -25
- package/changelog/log-2026-06-25.md +35 -0
- package/dist/express/mount.d.ts.map +1 -1
- package/dist/express/mount.js +8 -9
- package/dist/express/mount.js.map +1 -1
- package/dist/fastify/register.d.ts +11 -0
- package/dist/fastify/register.d.ts.map +1 -1
- package/dist/fastify/register.js +28 -0
- package/dist/fastify/register.js.map +1 -1
- package/dist/runtime/fast.d.ts.map +1 -1
- package/dist/runtime/fast.js +1 -0
- package/dist/runtime/fast.js.map +1 -1
- package/dist/runtime/lifecycle.d.ts.map +1 -1
- package/dist/runtime/lifecycle.js +1 -0
- package/dist/runtime/lifecycle.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# express-fastify-runtime
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/express-fastify-runtime)
|
|
4
|
+
[](./LICENSE)
|
|
5
|
+
|
|
6
|
+
<!-- [](https://www.npmjs.com/package/express-fastify-runtime) -->
|
|
7
|
+
|
|
3
8
|
> Your Express app. Fastify's speed. One line. No rewrite.
|
|
4
9
|
|
|
5
10
|
```ts
|
|
@@ -9,7 +14,7 @@ import express from "express";
|
|
|
9
14
|
const app = express();
|
|
10
15
|
app.get("/", (req, res) => res.json({ hello: "world" }));
|
|
11
16
|
|
|
12
|
-
fast(app).listen({ port: 3000 });
|
|
17
|
+
fast(app).listen({ port: 3000 }); // π that's the whole trick
|
|
13
18
|
```
|
|
14
19
|
|
|
15
20
|
---
|
|
@@ -17,18 +22,18 @@ fast(app).listen({ port: 3000 }); // π that's the whole trick
|
|
|
17
22
|
## A short, slightly emotional story
|
|
18
23
|
|
|
19
24
|
I love Express. I love it the way you love a comfortable pair of shoes β `req`, `res`,
|
|
20
|
-
`next`, a thousand middlewares on npm, and muscle memory built over years. Express is
|
|
25
|
+
`next`, a thousand middlewares on npm, and muscle memory built over years. Express is _home_.
|
|
21
26
|
|
|
22
27
|
Then one day someone showed me a Fastify benchmark and my coffee went cold. "Two-ish times the
|
|
23
28
|
throughput," they said, smiling like they'd discovered fire. And I thought: do I really have to
|
|
24
29
|
abandon my comfortable shoes and rewrite everything in a new framework just to go faster?
|
|
25
30
|
|
|
26
31
|
So I went looking for a shortcut. I found tools that "run Express on Fastify" β and many of them
|
|
27
|
-
do
|
|
32
|
+
do _exactly_ one thing: they hand your Express app to Fastify and let Fastify⦠call Express for
|
|
28
33
|
every request. Your app technically runs "on Fastify." It is not one bit faster. It's a very
|
|
29
34
|
polite handshake between two frameworks where nothing actually changes. Cool sticker, no engine.
|
|
30
35
|
|
|
31
|
-
**`express-fastify-runtime` is the engine.** It doesn't just
|
|
36
|
+
**`express-fastify-runtime` is the engine.** It doesn't just _expose_ your Express app to
|
|
32
37
|
Fastify β it **compiles** your safe routes and middleware onto Fastify's real request pipeline,
|
|
33
38
|
and only falls back to actual Express for the things that genuinely need it (multipart uploads,
|
|
34
39
|
`res.render`, streaming bodies, anything unusual). You keep writing Express. It actually gets
|
|
@@ -55,8 +60,16 @@ You don't rewrite a thing. You wrap one line. Your shoes stay on.
|
|
|
55
60
|
|
|
56
61
|
## Install
|
|
57
62
|
|
|
63
|
+
[**express-fastify-runtime** on npm](https://www.npmjs.com/package/express-fastify-runtime)
|
|
64
|
+
|
|
58
65
|
```bash
|
|
59
66
|
npm install express-fastify-runtime
|
|
67
|
+
# or
|
|
68
|
+
pnpm add express-fastify-runtime
|
|
69
|
+
# or
|
|
70
|
+
yarn add express-fastify-runtime
|
|
71
|
+
# or
|
|
72
|
+
bun add express-fastify-runtime
|
|
60
73
|
```
|
|
61
74
|
|
|
62
75
|
`express` is a **peer dependency** β bring your own (`^4.18` or `^5`). `fast()` uses whatever
|
|
@@ -74,26 +87,27 @@ Express you already have.
|
|
|
74
87
|
You wrote a normal Express app. Wrap it. Done.
|
|
75
88
|
|
|
76
89
|
```ts
|
|
77
|
-
import "express-fastify-runtime";
|
|
90
|
+
import "express-fastify-runtime"; // load first (the one rule)
|
|
78
91
|
import express from "express";
|
|
79
92
|
import morgan from "morgan";
|
|
80
93
|
import helmet from "helmet";
|
|
81
94
|
import { fast } from "express-fastify-runtime";
|
|
82
95
|
|
|
83
96
|
const app = express();
|
|
84
|
-
app.use(morgan("tiny"));
|
|
85
|
-
app.use(helmet());
|
|
86
|
-
app.use(express.json());
|
|
97
|
+
app.use(morgan("tiny")); // logs, correctly, per request
|
|
98
|
+
app.use(helmet()); // security headers, intact
|
|
99
|
+
app.use(express.json()); // parsed by Fastify's fast parser under the hood
|
|
87
100
|
|
|
88
101
|
app.get("/users/:id", (req, res) => {
|
|
89
102
|
res.json({ id: req.params.id });
|
|
90
103
|
});
|
|
91
104
|
|
|
92
|
-
app.use((err, req, res, next) => {
|
|
105
|
+
app.use((err, req, res, next) => {
|
|
106
|
+
// your error middleware still works
|
|
93
107
|
res.status(500).json({ error: err.message });
|
|
94
108
|
});
|
|
95
109
|
|
|
96
|
-
const fastApp = fast(app);
|
|
110
|
+
const fastApp = fast(app); // returns a Fastify instance
|
|
97
111
|
fastApp.listen({ port: 3000 });
|
|
98
112
|
```
|
|
99
113
|
|
|
@@ -115,9 +129,9 @@ import { fast } from "express-fastify-runtime";
|
|
|
115
129
|
const app = express();
|
|
116
130
|
app.get("/", (req, res) => res.json({ ok: true }));
|
|
117
131
|
|
|
118
|
-
const fastApp = fast(app, { fastify: { logger: true } });
|
|
119
|
-
await fastApp.register(rateLimit, { max: 100 });
|
|
120
|
-
await fastApp.ready();
|
|
132
|
+
const fastApp = fast(app, { fastify: { logger: true } }); // pass Fastify options through
|
|
133
|
+
await fastApp.register(rateLimit, { max: 100 }); // real Fastify plugins
|
|
134
|
+
await fastApp.ready(); // let plugins load before listen
|
|
121
135
|
await fastApp.listen({ port: 3000 });
|
|
122
136
|
```
|
|
123
137
|
|
|
@@ -128,7 +142,7 @@ Fastify's full lifecycle (so 404s and internals work):
|
|
|
128
142
|
|
|
129
143
|
```ts
|
|
130
144
|
const fastApp = fast(app);
|
|
131
|
-
const server = fastApp.server;
|
|
145
|
+
const server = fastApp.server; // http.Server
|
|
132
146
|
server.listen(3000, () => console.log("up on 3000"));
|
|
133
147
|
```
|
|
134
148
|
|
|
@@ -141,8 +155,10 @@ Node app β attach your socket server to `fastApp.server`:
|
|
|
141
155
|
import { Server as IOServer } from "socket.io";
|
|
142
156
|
|
|
143
157
|
const fastApp = fast(app);
|
|
144
|
-
const io = new IOServer(fastApp.server);
|
|
145
|
-
io.on("connection", (socket) =>
|
|
158
|
+
const io = new IOServer(fastApp.server); // share the same HTTP server
|
|
159
|
+
io.on("connection", (socket) =>
|
|
160
|
+
socket.emit("hello", "from express-fastify-runtime"),
|
|
161
|
+
);
|
|
146
162
|
|
|
147
163
|
fastApp.server.listen(3000);
|
|
148
164
|
```
|
|
@@ -170,7 +186,10 @@ Wrap the handler/middleware. Works with plain functions and arrow functions:
|
|
|
170
186
|
```ts
|
|
171
187
|
import { expressLane } from "express-fastify-runtime";
|
|
172
188
|
|
|
173
|
-
app.get(
|
|
189
|
+
app.get(
|
|
190
|
+
"/page",
|
|
191
|
+
expressLane((req, res) => res.render("index", { title: "Hi" })),
|
|
192
|
+
);
|
|
174
193
|
```
|
|
175
194
|
|
|
176
195
|
### `@ExpressLane` β decorator form (class-method controllers)
|
|
@@ -226,13 +245,13 @@ Numbers are req/s, **median of repeated runs with warmup** (single-shot HTTP ben
|
|
|
226
245
|
20β30%, so don't trust one sample β including ours; reproduce with `npm run benchmark:table`).
|
|
227
246
|
10 connections, Node on an Apple-silicon laptop. Higher is better.
|
|
228
247
|
|
|
229
|
-
| Scenario
|
|
230
|
-
|
|
231
|
-
| Plain JSON route (5 middleware)
|
|
232
|
-
| JSON DB read
|
|
233
|
-
| Middleware stack (helmet+morgan+json+custom) |
|
|
234
|
-
| POST 1KB JSON
|
|
235
|
-
| Auth (JWT verify)
|
|
248
|
+
| Scenario | Express | Fastify | **fast()** | fast/Express | fast/Fastify |
|
|
249
|
+
| -------------------------------------------- | ------: | ------: | ---------: | -----------: | -----------: |
|
|
250
|
+
| Plain JSON route (5 middleware) | 39,976 | 68,112 | **50,552** | **1.26Γ** | 0.74Γ |
|
|
251
|
+
| JSON DB read | 41,848 | 68,624 | **50,584** | **1.21Γ** | 0.74Γ |
|
|
252
|
+
| Middleware stack (helmet+morgan+json+custom) | 29,424 | 32,736 | **40,184** | **1.37Γ** | **1.23Γ** |
|
|
253
|
+
| POST 1KB JSON | 33,018 | 46,752 | **46,696** | **1.41Γ** | **1.00Γ** |
|
|
254
|
+
| Auth (JWT verify) | 17,636 | 33,976 | **19,360** | **1.10Γ** | 0.57Γ |
|
|
236
255
|
|
|
237
256
|
**Reading the table:**
|
|
238
257
|
|
|
@@ -240,7 +259,7 @@ Numbers are req/s, **median of repeated runs with warmup** (single-shot HTTP ben
|
|
|
240
259
|
- It **matches or beats Fastify** on middleware-heavy and small-payload workloads.
|
|
241
260
|
- On a tight pure-JSON hot path it trails raw Fastify a little β that's the unavoidable cost of
|
|
242
261
|
presenting a real Express `req`/`res`, and it's still well ahead of Express.
|
|
243
|
-
- **Auth (JWT):** the gap there isn't the adapter β it's the
|
|
262
|
+
- **Auth (JWT):** the gap there isn't the adapter β it's the _library_. Fastify's benchmark uses
|
|
244
263
|
`@fastify/jwt` (built on `fast-jwt`), which is simply faster than `jsonwebtoken`. Want that
|
|
245
264
|
speed in your Express app? Use `fast-jwt` directly in your auth middleware β it's
|
|
246
265
|
framework-agnostic.
|
|
@@ -1,5 +1,40 @@
|
|
|
1
1
|
# 2026-06-25
|
|
2
2
|
|
|
3
|
+
## Fix: empty JSON body 400'd ("Body cannot be emptyβ¦") β now matches express.json()
|
|
4
|
+
|
|
5
|
+
Reported by a consumer: bodyless requests sent with `Content-Type: application/json` (common from
|
|
6
|
+
axios on POST/PUT/DELETE with no payload) failed with
|
|
7
|
+
`FST_ERR_CTP_EMPTY_JSON_BODY` β "Body cannot be empty when content-type is set to 'application/json'".
|
|
8
|
+
|
|
9
|
+
- **Cause.** `express.json()` tolerates an empty body and sets `req.body = {}`; Fastify's default
|
|
10
|
+
`application/json` parser rejects it with 400. Because `fast()` maps Express's JSON parsing onto
|
|
11
|
+
Fastify's native parser, it inherited the stricter behavior β 400'ing requests that work on plain
|
|
12
|
+
Express.
|
|
13
|
+
- **Fix** (`src/fastify/register.ts` `installExpressJsonParser`, wired into `runtime/fast.ts` and
|
|
14
|
+
`runtime/lifecycle.ts`): override Fastify's JSON content-type parser to behave like Express β
|
|
15
|
+
empty/whitespace body β `{}`, otherwise `JSON.parse` (malformed JSON still β 400, as on Express).
|
|
16
|
+
- **Test**: `test/integration/middleware-parity.test.js` now asserts empty body β 200 `{}`, valid
|
|
17
|
+
body β parsed, malformed JSON β 400.
|
|
18
|
+
|
|
19
|
+
## Fix: writes (POST/PUT with a JSON body) 500'd on the Express-lane fallback (Express 4)
|
|
20
|
+
|
|
21
|
+
Reported by a consumer (Express 4): reads worked, but every request with a JSON body returned
|
|
22
|
+
`500 Cannot assign to read only property 'body' of object '#<IncomingMessage>'`.
|
|
23
|
+
|
|
24
|
+
- **Cause.** On the Express-lane fallback, Fastify has already parsed and consumed the body stream.
|
|
25
|
+
We attached the parsed body to the raw request as a **read-only** property to stop Express's
|
|
26
|
+
`express.json()` from overwriting it with an empty object. But body-parser **assigns**
|
|
27
|
+
`req.body = ...` unconditionally β and assigning to a read-only property *throws* on Express 4's
|
|
28
|
+
strict body-parser (Express 5 silently drops it, masking the bug). Any route on the Express lane
|
|
29
|
+
with a JSON body 500'd.
|
|
30
|
+
- **Fix** (`src/express/mount.ts`): attach the body as **writable** and set body-parser's
|
|
31
|
+
`req._body = true` flag, so `express.json()`/`urlencoded()`/etc. **skip** entirely (early-return)
|
|
32
|
+
instead of re-reading the consumed stream β no re-parse, no overwrite, no throw. Only set when
|
|
33
|
+
Fastify actually parsed a body, so urlencoded/raw requests Fastify doesn't parse still flow to the
|
|
34
|
+
real Express parsers untouched.
|
|
35
|
+
- **Test**: `test/compat/express4.test.js` now forces a POST with a JSON body onto the Express lane
|
|
36
|
+
and asserts `200` + correct `req.body` (the regression only manifests under Express 4).
|
|
37
|
+
|
|
3
38
|
## Publish prep
|
|
4
39
|
|
|
5
40
|
- **Fastify upgraded to 5.8.5** (latest; includes the recent security/CVE fixes). Dependency floor
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/express/mount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAU3C,8EAA8E;AAC9E,MAAM,MAAM,uBAAuB,GAAG,eAAe,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE3E,mDAAmD;AACnD,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,WAAW,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,IAAI,
|
|
1
|
+
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/express/mount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAU3C,8EAA8E;AAC9E,MAAM,MAAM,uBAAuB,GAAG,eAAe,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE3E,mDAAmD;AACnD,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,WAAW,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,IAAI,CAwDN"}
|
package/dist/express/mount.js
CHANGED
|
@@ -34,18 +34,17 @@ function mountExpress(fastify, expressApp, options) {
|
|
|
34
34
|
(0, maxListeners_1.applyMaxListeners)(request.raw, reply.raw);
|
|
35
35
|
const raw = request.raw;
|
|
36
36
|
const res = reply.raw;
|
|
37
|
-
// Fastify
|
|
38
|
-
//
|
|
39
|
-
//
|
|
37
|
+
// Fastify already parsed and consumed the body stream. Attach the parsed body AND set
|
|
38
|
+
// body-parser's `_body` flag so Express's express.json()/urlencoded()/etc. SKIP (they early-
|
|
39
|
+
// return when req._body is set) instead of re-reading the now-empty stream. The body must stay
|
|
40
|
+
// WRITABLE: body parsers assign `req.body = ...` unconditionally, and a read-only property
|
|
41
|
+
// throws "Cannot assign to read only property 'body'" on Express 4 (and silently drops the
|
|
42
|
+
// assignment on Express 5). The `_body` flag is what prevents the overwrite, not read-only.
|
|
40
43
|
const bodyFromFastify = await Promise.resolve(request.body);
|
|
41
44
|
const req = raw;
|
|
42
45
|
if (bodyFromFastify !== undefined) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
writable: false,
|
|
46
|
-
configurable: true,
|
|
47
|
-
enumerable: true,
|
|
48
|
-
});
|
|
46
|
+
req.body = bodyFromFastify;
|
|
47
|
+
req._body = true;
|
|
49
48
|
}
|
|
50
49
|
await new Promise((resolve, reject) => {
|
|
51
50
|
let settled = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/express/mount.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AA8BH,
|
|
1
|
+
{"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/express/mount.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AA8BH,oCA4DC;AArFD,wDAA0D;AAkB1D;;;;;;GAMG;AACH,SAAgB,YAAY,CAC1B,OAAwB,EACxB,UAAuB,EACvB,OAA6B;IAE7B,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAElD,OAAO,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAuB,EAAE,KAAmB,EAAE,EAAE;QAChF,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;YACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,2CAA2C,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,IAAA,gCAAiB,EAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAE1C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QAEtB,sFAAsF;QACtF,6FAA6F;QAC7F,+FAA+F;QAC/F,2FAA2F;QAC3F,2FAA2F;QAC3F,4FAA4F;QAC5F,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,OAAO,CAAE,OAA8B,CAAC,IAAI,CAAC,CAAC;QACpF,MAAM,GAAG,GAAG,GAAoD,CAAC;QACjE,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,GAAG,CAAC,IAAI,GAAG,eAAe,CAAC;YAC3B,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YAEF,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAE1B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;gBAC3B,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBACtC,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;oBAChB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBAC7C,OAAO;gBACT,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YAED,UAAgD,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -9,4 +9,15 @@ export interface RegisterCompiledRoutesOptions {
|
|
|
9
9
|
diagnostics?: boolean;
|
|
10
10
|
}
|
|
11
11
|
export declare function registerCompiledRoutes(fastify: FastifyInstance, classified: ClassifiedRoute[], runMiddleware: (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => void | Promise<void>, options?: RegisterCompiledRoutesOptions): void;
|
|
12
|
+
/**
|
|
13
|
+
* Make Fastify's JSON body parsing behave like Express's `express.json()`.
|
|
14
|
+
*
|
|
15
|
+
* Fastify's default `application/json` parser rejects an empty body with
|
|
16
|
+
* `FST_ERR_CTP_EMPTY_JSON_BODY` ("Body cannot be empty when content-type is set to
|
|
17
|
+
* 'application/json'"). Express's body-parser tolerates it and sets `req.body = {}`. Clients (axios
|
|
18
|
+
* et al.) routinely send `Content-Type: application/json` with no body on bodyless POST/PUT/DELETE
|
|
19
|
+
* calls, so the default would 400 requests that work fine on plain Express. Override the parser to
|
|
20
|
+
* match Express: empty body β `{}`, otherwise `JSON.parse` (400 on malformed JSON, as before).
|
|
21
|
+
*/
|
|
22
|
+
export declare function installExpressJsonParser(fastify: FastifyInstance): void;
|
|
12
23
|
//# sourceMappingURL=register.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/fastify/register.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKtF,MAAM,WAAW,6BAA6B;IAC5C,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,eAAe,EAAE,EAC7B,aAAa,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACtG,OAAO,CAAC,EAAE,6BAA6B,GACtC,IAAI,CAIN"}
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/fastify/register.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKtF,MAAM,WAAW,6BAA6B;IAC5C,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,eAAe,EAAE,EAC7B,aAAa,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACtG,OAAO,CAAC,EAAE,6BAA6B,GACtC,IAAI,CAIN;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAmBvE"}
|
package/dist/fastify/register.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.registerCompiledRoutes = registerCompiledRoutes;
|
|
7
|
+
exports.installExpressJsonParser = installExpressJsonParser;
|
|
7
8
|
const request_1 = require("./adapters/request");
|
|
8
9
|
const response_1 = require("./adapters/response");
|
|
9
10
|
const compile_1 = require("../app/compile");
|
|
@@ -12,4 +13,31 @@ function registerCompiledRoutes(fastify, classified, runMiddleware, options) {
|
|
|
12
13
|
const adaptResponse = (0, response_1.createResponseAdapter)();
|
|
13
14
|
(0, compile_1.registerFastifyRoutes)(fastify, classified, adaptRequest, adaptResponse, runMiddleware, options);
|
|
14
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Make Fastify's JSON body parsing behave like Express's `express.json()`.
|
|
18
|
+
*
|
|
19
|
+
* Fastify's default `application/json` parser rejects an empty body with
|
|
20
|
+
* `FST_ERR_CTP_EMPTY_JSON_BODY` ("Body cannot be empty when content-type is set to
|
|
21
|
+
* 'application/json'"). Express's body-parser tolerates it and sets `req.body = {}`. Clients (axios
|
|
22
|
+
* et al.) routinely send `Content-Type: application/json` with no body on bodyless POST/PUT/DELETE
|
|
23
|
+
* calls, so the default would 400 requests that work fine on plain Express. Override the parser to
|
|
24
|
+
* match Express: empty body β `{}`, otherwise `JSON.parse` (400 on malformed JSON, as before).
|
|
25
|
+
*/
|
|
26
|
+
function installExpressJsonParser(fastify) {
|
|
27
|
+
fastify.removeContentTypeParser('application/json');
|
|
28
|
+
fastify.addContentTypeParser('application/json', { parseAs: 'string' }, (_req, body, done) => {
|
|
29
|
+
const text = typeof body === 'string' ? body : body == null ? '' : String(body);
|
|
30
|
+
if (text.trim().length === 0) {
|
|
31
|
+
done(null, {}); // Express returns {} for an empty JSON body
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
done(null, JSON.parse(text));
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
err.statusCode = 400;
|
|
39
|
+
done(err, undefined);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
15
43
|
//# sourceMappingURL=register.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/fastify/register.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAcH,wDASC;
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/fastify/register.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAcH,wDASC;AAYD,4DAmBC;AAjDD,gDAA0D;AAC1D,kDAA4D;AAC5D,4CAAuD;AAOvD,SAAgB,sBAAsB,CACpC,OAAwB,EACxB,UAA6B,EAC7B,aAAsG,EACtG,OAAuC;IAEvC,MAAM,YAAY,GAAG,IAAA,8BAAoB,GAAE,CAAC;IAC5C,MAAM,aAAa,GAAG,IAAA,gCAAqB,GAAE,CAAC;IAC9C,IAAA,+BAAqB,EAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AAClG,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,wBAAwB,CAAC,OAAwB;IAC/D,OAAO,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IACpD,OAAO,CAAC,oBAAoB,CAC1B,kBAAkB,EAClB,EAAE,OAAO,EAAE,QAAQ,EAAE,EACrB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,4CAA4C;YAC5D,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACZ,GAA+B,CAAC,UAAU,GAAG,GAAG,CAAC;YAClD,IAAI,CAAC,GAAY,EAAE,SAAS,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast.d.ts","sourceRoot":"","sources":["../../src/runtime/fast.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAgB,EACd,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAC1B,MAAM,SAAS,CAAC;AA8BjB,sDAAsD;AACtD,MAAM,WAAW,mBAAmB;IAClC,mFAAmF;IACnF,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,gEAAgE;AAChE,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,uDAAuD;IACvD,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAED;;;;;;;;GAQG;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG;IAEnD,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAE7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAqCF;;;;;;;;;;GAUG;AACH,wBAAgB,IAAI,CAClB,GAAG,EAAE,UAAU,EACf,GAAG,CAAC,EAAE,OAAO,GAAG,oBAAoB,GACnC,eAAe,
|
|
1
|
+
{"version":3,"file":"fast.d.ts","sourceRoot":"","sources":["../../src/runtime/fast.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAgB,EACd,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAC1B,MAAM,SAAS,CAAC;AA8BjB,sDAAsD;AACtD,MAAM,WAAW,mBAAmB;IAClC,mFAAmF;IACnF,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,gEAAgE;AAChE,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,uDAAuD;IACvD,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAED;;;;;;;;GAQG;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG;IAEnD,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;IAE7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAqCF;;;;;;;;;;GAUG;AACH,wBAAgB,IAAI,CAClB,GAAG,EAAE,UAAU,EACf,GAAG,CAAC,EAAE,OAAO,GAAG,oBAAoB,GACnC,eAAe,CAkHjB"}
|
package/dist/runtime/fast.js
CHANGED
|
@@ -65,6 +65,7 @@ function fast(app, ops) {
|
|
|
65
65
|
? ops.fastify
|
|
66
66
|
: ops;
|
|
67
67
|
const fastify = (0, fastify_1.default)({ ...DEFAULT_OPTS, ...fastifyOpts });
|
|
68
|
+
(0, register_1.installExpressJsonParser)(fastify); // match express.json(): tolerate empty bodies (β {})
|
|
68
69
|
const diagnostics = ops && "experimental" in ops && ops.experimental?.diagnostics === true;
|
|
69
70
|
const entries = (0, introspectExpress_1.introspectExpressApp)(app);
|
|
70
71
|
if (entries !== null && entries.length > 0) {
|
package/dist/runtime/fast.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast.js","sourceRoot":"","sources":["../../src/runtime/fast.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;AAiHH,
|
|
1
|
+
{"version":3,"file":"fast.js","sourceRoot":"","sources":["../../src/runtime/fast.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/runtime/lifecycle.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAA0B,MAAM,mBAAmB,CAAC;AAgBhF,MAAM,WAAW,gBAAgB;IAC/B,4GAA4G;IAC5G,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/runtime/lifecycle.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAA0B,MAAM,mBAAmB,CAAC;AAgBhF,MAAM,WAAW,gBAAgB;IAC/B,4GAA4G;IAC5G,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,cAAc,CA6JpE"}
|
|
@@ -121,6 +121,7 @@ function createApp(options) {
|
|
|
121
121
|
logger: false,
|
|
122
122
|
bodyLimit: 10 * 1024 * 1024, // 10MB; matches express.json({ limit: '10mb' }) for large payloads
|
|
123
123
|
});
|
|
124
|
+
(0, register_1.installExpressJsonParser)(fastify); // match express.json(): tolerate empty bodies (β {})
|
|
124
125
|
const classified = (0, classify_1.classifyAll)(routeStore.getAll());
|
|
125
126
|
const runMiddleware = (_req, _res, next) => next();
|
|
126
127
|
(0, register_1.registerCompiledRoutes)(fastify, classified, runMiddleware);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/runtime/lifecycle.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAwBH,
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/runtime/lifecycle.ts"],"names":[],"mappings":"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"}
|