前端开发者们在使用 Node.js 开发后端应用时可能会使用 Express,但是 Fastify 作为一款新的框架也逐渐得到了越来越广泛的使用。Fastify 具有更快的性能,更好的安全性和优秀的插件支持。但是,从 Express 迁移到 Fastify 可能会出现一些问题,本文将提供一些实用的指南。
安装和配置 Fastify
安装 Fastify
使用 NPM 可以轻松安装 Fastify,只需要运行以下命令即可:
npm install fastify --save
配置 Fastify
Fastify 可以通过传递一个选项对象来配置和启动服务器。选项对象包括:
- logger:设置 Fastify 的日志记录器。可以使用自定义的日志记录器或使用内置的日志记录器。
- bodyLimit:设置请求主体的大小限制。
- pluginTimeout:设置插件的超时时间。
- https:允许 Fastify 监听 HTTPS 请求。
- http2:允许 Fastify 监听 HTTP/2 请求。
- ignoreTrailingSlash:为路由设置是否忽略尾部斜杠。
- trustProxy:启用此选项后,Fastify 将从 X-Forwarded-* 标头解析客户端 IP。
以下是 Fastify 的基本配置:
const fastify = require('fastify')({ logger: true, bodyLimit: 1048576, // 1MB pluginTimeout: 10000, // 10 seconds })
从 Express 迁移到 Fastify
路由
定义路由
在 Express 中,我们通过创建 app
对象来定义路由:
const express = require('express') const app = express() app.get('/', function(req, res) { res.send('Hello World!') })
在 Fastify 中,我们使用 fastify
对象定义路由:
fastify.get('/', function(request, reply) { reply.send('Hello World!') })
需要注意的是,在 Fastify 中,回调函数的第一个参数不再是 req
和 res
,而是一个包含了请求和响应的 request
和 reply
参数。
外部引用
在 Express 中,我们可以使用 require
引入其它模块的路由:
const express = require('express') const app = express() const myRouter = require('./myRouter') app.use('/', myRouter)
在 Fastify 中,因为它对 Node.js 的模块系统支持更好,所以可以使用 require
来引入其它模块:
const myRouter = require('./myRouter') fastify.register(myRouter, { prefix: '/myprefix' })
需要注意的是,Fastify 使用 prefix
来指定模块的路由前缀,这与 Express 使用 app.use
的方式不同。
Middleware
定义 Middleware
在 Express 中,我们添加 Middleware 使用 app.use
:
const express = require('express') const app = express() app.use(function(req, res, next) { console.log('Middleware!') next() })
在 Fastify 中,使用 fastify.use
添加 Middleware:
fastify.use(function(request, reply, next) { console.log('Middleware!') next() })
同样需要注意的是,忽略 next()
将导致请求被挂起。
错误处理
在 Express 中,我们可以添加全局错误处理 Middleware:
app.use(function(err, req, res, next) { console.error(err.stack) res.status(500).send('Something broke!') })
在 Fastify 中,添加错误处理 Middleware:
fastify.setErrorHandler(function(err, request, reply) { console.error(err) reply.status(500).send({ error: 'Something broke!' }) })
插件
Fastify 支持通过插件来扩展功能。下面是一些常用的插件:
- fastify-cors:提供 CORS 支持。
- fastify-auth:提供 JWT 和 OAuth2 支持。
- fastify-mongodb:提供 MongoDB 支持。
- fastify-redis:提供 Redis 支持。
安装这些插件只需要简单地调用 register
函数即可。例如,使用 fastify-cors
插件:
const fastify = require('fastify')() fastify.register(require('fastify-cors'), { origin: true, methods: 'GET,PUT,POST', })
性能比较
根据官方提供的基准测试,Fastify 性能比 Express 提升了 3-5 倍。这归功于 Fastify 对路由、插件和错误处理等方面的优化。
结论
在此实用指南中,我们提供了从 Express 迁移到 Fastify 的一些实用指南。虽然迁移可能需要一些时间,但由于 Fastify 具有更好的性能和更高的安全性,这项工作是值得的。
示例代码:
-- -------------------- ---- ------- -- ------- -- ----- ------- - -------------------- ------- ----- ---------- -------- -------------- ------ -- -- ---- ---------------- ----------------- ------ - ----------------- -------- -- -- -- ---------- ----------------------------- ------ ----- - -------------------------- ------ -- -- ------ ---------- ------------------------------------- -------- ------ - ------------------ ------------------------ ------ ---------- ------- -- -- -- ---- ------------------------------------ - ------------------------------------------------------------------------------ -------- ------------------------------------------------------------------------------------------------------------------------