ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Node系列 · Express:常用的中间件

Node系列 · Express:常用的中间件 Node系列 · Express常用的中间件Express 的核心能力只有路由和中间件机制——所有开箱即用的功能都是中间件实现的。本章盘点最常用的几个内置和第三方中间件。一、内置中间件Express 自带1.1express.static静态资源服务把指定目录的文件对外暴露成 HTTP 静态资源app.use(express.static(public)); app.use(express.static(files)); // 多个目录按顺序查找├── index.html ├── style.css └── images/logo.png$curlhttp://localhost:3000/index.html $curlhttp://localhost:3000/style.css $curlhttp://localhost:3000/images/logo.png::: tip生产环境用 Nginx / CDN 提供静态资源——Express 静态中间件适合本地开发和内部工具高并发场景 Nginx 性能更好。:::虚拟路径前缀app.use(/static, express.static(public)); // 访问 /static/style.css → public/style.css1.2express.urlencoded解析表单 POSTapp.use(express.urlencoded({ extended: false })); // 接收表单提交nameAliceage25 app.post(/login, (req, res) { console.log(req.body); // { name: Alice, age: 25 } res.send(ok); });extended: false用querystring库解析只支持字符串extended: true用qs支持嵌套对象。1.3express.json解析 JSON POSTapp.use(express.json({ limit: 1mb })); // 接收 JSON{name:Alice,age:25} app.post(/api/users, (req, res) { console.log(req.body); // { name: Alice, age: 25 } res.json({ id: 1 }); });参数默认值说明limit100kb请求体最大体积防 OOMstricttrue只接受对象 / 数组不接收字符串 / nulltypeapplication/jsonContent-Type 匹配规则二、第三方中间件2.1morganHTTP 请求日志npminstallmorganconst morgan require(morgan); app.use(morgan(dev)); // 开发彩色简洁 app.use(morgan(combined)); // 生产Apache 风格详细输出示例:method :url :status :res[content-length] - :response-time ms GET /api/users 200 42 - 12 ms格式用途combined生产详细common生产中等dev开发彩色short最简洁tiny比short更短写文件const fs require(fs); const accessLog fs.createWriteStream(access.log, { flags: a }); app.use(morgan(combined, { stream: accessLog }));2.2cors跨域npminstallcorsconst cors require(cors); // 允许所有跨域开发期 app.use(cors()); // 只允许特定源 app.use(cors({ origin: [https://example.com, https://admin.example.com], credentials: true, // 允许携带 Cookie }));详见 第 11 章 cors 中间件。2.3helmet安全头npminstallhelmetconst helmet require(helmet); app.use(helmet());一行给响应加上 11 个安全相关的 HTTP 头X-Content-Type-Options: nosniff防 MIME 嗅探X-Frame-Options: SAMEORIGIN防点击劫持Strict-Transport-Security强制 HTTPSX-XSS-ProtectionXSS 防护等::: tip所有生产 Express 项目都建议加helmet()——一行代码解决大量安全问题。:::2.4compressionGzip 压缩npminstallcompressionconst compression require(compression); app.use(compression());自动给响应体做 gzip 压缩——文本响应HTML / JSON大小可减少 60-80%。2.5cookie-parser解析 Cookienpminstallcookie-parserconst cookieParser require(cookie-parser); app.use(cookieParser(my-secret)); app.get(/set, (req, res) { res.cookie(token, abc123, { httpOnly: true }); res.send(ok); }); app.get(/get, (req, res) { console.log(req.cookies); // { token: abc123 } res.json(req.cookies); });2.6multer文件上传npminstallmulterconst multer require(multer); const upload multer({ dest: uploads/ }); app.post(/api/upload, upload.single(avatar), (req, res) { console.log(req.file); // { // fieldname: avatar, // originalname: photo.jpg, // encoding: 7bit, // mimetype: image/jpeg, // destination: uploads/, // filename: xxx-xxxx.jpg, // path: uploads/xxx-xxxx.jpg, // size: 12345 // } res.json({ url: /uploads/${req.file.filename} }); });2.7express-rate-limit限流npminstallexpress-rate-limitconst rateLimit require(express-rate-limit); const limiter rateLimit({ windowMs: 60 * 1000, // 1 分钟 max: 100, // 最多 100 次请求 message: 请求过于频繁请稍后再试, }); app.use(/api, limiter);防爬虫、防爆破登录接口。三、中间件选型速查场景中间件静态资源express.static解析 JSON bodyexpress.json解析表单 bodyexpress.urlencodedHTTP 日志morgan跨域cors安全头helmetGzipcompressionCookiecookie-parser文件上传multer限流express-rate-limitSessionexpress-session详见 sessionJWTjsonwebtoken详见 JWT四、最佳实践场景推荐生产环境必须helmetcompressioncors开发环境morgan(dev)body 解析express.jsonexpress.urlencoded静态资源开发用内置生产用 Nginx限流公开接口必加防爆破、防爬虫文件上传限制大小如limits: { fileSize: 5 * 1024 * 1024 }五、小结express.static提供静态资源服务express.json/express.urlencoded解析请求体第三方必备三件套morgan日志helmet安全compression压缩文件上传用multer限流用express-rate-limit生产环境最少要helmetcompressioncorsmorgan body 解析器中间件按app.use()顺序执行通用中间件在前业务路由在后
返回列表