When I was writing the article How to migrate your app from Express to Fastify I noted down a few of the things I learnt along the way.
Server creation and configuration is quite similar
Changing the creation and configuration of an Express server instance over to Fastify requires a fairly small set of changes:
diff --git a/api-after/package.json b/api-after/package.json
index 8efee6f..f51a9c8 100644
--- a/api-after/package.json
+++ b/api-after/package.json
@@ -11,6 +11,9 @@
"license": "MIT",
"dependencies": {
"cors": "^2.8.5",
- "express": "^4.17.1"
+ "express": "^4.17.1",
+ "fastify": "^3.13.0",
+ "fastify-express": "^0.3.2"
}
}
diff --git a/api-after/src/server.js b/api-after/src/server.js
index 22a692e..156553e 100644
--- a/api-after/src/server.js
+++ b/api-after/src/server.js
@@ -1,14 +1,17 @@
// src/server.js
-import express from "express";
+import Fastify from "fastify";
+import ExpressPlugin from "fastify-express";
import config from "./config.js";
import routes from "./routes.js";
-const app = express();
+const fastify = Fastify({
+ logger: true
+});
-app.use("/user", routes);
+await fastify.register(ExpressPlugin);
-const server = app.listen(3000, () => {
- console.log(\`Example app listening at http://localhost:${server.address().port}\`);
-});
+fastify.use("/user", routes);
+
+fastify.listen(3000);
Fastify plugins are configured a little differently to Express middleware
In Express you typically configure middleware by calling it with an options object e.g.
cors({ origin: true });
With Fastify plugins you don’t call them, but you pass in options separately instead e.g.
fastify.register(CorsPlugin, { origin: true });
Documentation: https://www.fastify.io/docs/latest/Plugins/
Express routes won’t show up when you call fastify.printRoutes()
If you’re using the use()
method from fastify-express
to add Express routes, they won’t show up when you call fastify.printRoutes()
.
My understanding is that this is because they’re not registered as "real" routes in Fastify’s router.
Documentation: https://www.fastify.io/docs/latest/Server/#printroutes
Fastify automatically serializes objects and arrays to JSON when you send them
When you migrate Express routes to Fastify routes, change calls to response.json()
to reply.send()
.
There is no reply.json()
method in Fastify as reply.send()
serializes objects and arrays to JSON automatically.
Documentation: https://www.fastify.io/docs/latest/Reply/#senddata