查看: 176|回复: 1

Express 4.x实战:中间件、RESTful API与项目生成

[复制链接]
发表于 昨天 22:00 | 显示全部楼层 |阅读模式
Express 是 Node.js 生态中最流行的 Web 框架,基于内置 http 模块封装了更简洁的 API 和强大的中间件机制。本文从基础用法入手,逐步深入到中间件链、RESTful 接口设计以及使用 express-generator 快速搭建项目,所有代码均基于 Express 4.x 版本。

一、Express 基础与请求/响应对象

安装 Express 4.x:
  1. npm install express@4
复制代码

创建最简服务器(监听 52273 端口):
  1. const express = require('express');
  2. const app = express();
  3. app.listen(52273, () => {
  4.   console.log('服务器监听地址是 http://127.0.0.1:52273');
  5. });
复制代码

1. 响应对象 response
response.send() 会根据传入参数类型自动返回合适格式:
- 字符串 → HTML
- 数组/对象 → JSON

示例:返回一个数组,浏览器自动收到 JSON:
  1. app.use((req, res) => {
  2.   let output = [];
  3.   for (let i = 0; i < 3; i++) {
  4.     output.push({ count: i, name: 'name - ' + i });
  5.   }
  6.   res.send(output);
  7. });
复制代码

2. 请求对象 request
常用属性:params(路由参数)、query(URL 查询变量)、headers(请求头)。

示例:根据 User-Agent 判断浏览器类型:
  1. app.use((req, res) => {
  2.   let agent = req.header('User-Agent');
  3.   if (agent.toLowerCase().match(/chrome/)) {
  4.     res.send('<h1>*_*欢迎使用谷歌浏览器</h1>');
  5.   } else {
  6.     res.send('<h1>^_^您使用的不是谷歌浏览器,当然这并不影响浏览网页</h1>');
  7.   }
  8. });
复制代码

二、中间件机制

Express 中间件通过 app.use() 注册,格式:app.use([path,] callback[, callback])。多个中间件通过 next() 串联执行。

示例:中间件传递变量:
  1. app.use((req, res, next) => {
  2.   req.number = 20;
  3.   res.number = 35;
  4.   next();
  5. });
  6. app.use((req, res) => {
  7.   res.send('<h1 style="color:green">' + req.number + ' : ' + res.number + '</h1>');
  8. });
复制代码

常用中间件:
- router:处理路由
- static:托管静态文件
- morgan:日志
- cookie-parser:处理 Cookie
- body-parser:解析 POST 请求体

1. router 中间件
取代 http 模块中的 if-else 路由判断,直接用 app.get()/app.post() 等。

路由参数示例:
  1. app.get('/page/:id', (req, res) => {
  2.   let name = req.params.id;
  3.   res.send('<h2 style="color:red">' + name + ' Page</h2>');
  4. });
复制代码

2. static 中间件(内置)
用于托管图片、CSS、JS 等静态文件:
  1. app.use(express.static(__dirname + '/image'));
  2. // 之后可直接通过路径访问 /image 下的文件,例如 /82.jpg
复制代码

3. cookie-parser 中间件
先安装:
  1. npm install cookie-parser
复制代码

设置无签名中间件,读写 Cookie:
  1. const cookieParser = require('cookie-parser');
  2. app.use(cookieParser());
  3. app.get('/', (req, res) => {
  4.   res.cookie('string', 'cookie');
  5.   res.cookie('json', { name: 'cookie', property: 'delicious' });
  6.   res.send(req.cookies);
  7. });
复制代码

4. body-parser 中间件
用于解析 POST 请求体(如 form 提交),需安装:
  1. npm install body-parser
复制代码

常用方法:bodyParser.urlencoded({ extended: false }) 用于解析 application/x-www-form-urlencoded 数据;bodyParser.json() 解析 JSON。

登录验证综合示例(使用 cookie-parser + body-parser + 文件读取):
  1. const fs = require('fs');
  2. const express = require('express');
  3. const cookieParser = require('cookie-parser');
  4. const bodyParser = require('body-parser');
  5. let app = express();
  6. app.use(cookieParser());
  7. app.use(bodyParser.urlencoded({ extended: false }));
  8. app.get('/', (req, res) => {
  9.   if (req.cookies.auth) {
  10.     res.send('<h1 style="color:red;text-align: center">登录成功</h1>');
  11.   } else {
  12.     res.redirect('/login');
  13.   }
  14. });
  15. app.get('/login', (req, res) => {
  16.   fs.readFile('login.html', (err, data) => {
  17.     res.send(data.toString());
  18.   });
  19. });
  20. app.post('/login', (req, res) => {
  21.   let login = req.body.login;
  22.   let pass = req.body.pass;
  23.   if (login == 'mingrisoft' && pass == '123456') {
  24.     res.cookie('auth', true);
  25.     res.redirect('/');
  26.   } else {
  27.     res.redirect('/login');
  28.   }
  29. });
  30. app.listen(52273);
复制代码

login.html 文件:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>登录页面</title>
  6. </head>
  7. <body>
  8. <form method="post">
  9. <fieldset style="width: 250px;margin: 0 auto;padding:20px">
  10. <legend style="color:#ff5722">管理员登录</legend>
  11. <table>
  12. <tr>
  13. <td><label for="user">账 号:</label></td>
  14. <td><input type="text" name="login" id="user"/></td>
  15. </tr>
  16. <tr height="40">
  17. <td><label for="pass">密 码:</label></td>
  18. <td><input type="password" name="pass" id="pass"/></td>
  19. </tr>
  20. <tr>
  21. <td colspan="2" align="center">
  22. <input type="submit" style="background: #41d7ea;width: 85px;height: 25px;border: 1px solid #e0ac5e;outline: none;border-radius: 5px;"/>
  23. </td>
  24. </tr>
  25. </table>
  26. </fieldset>
  27. </form>
  28. </body>
  29. </html>
复制代码

三、实现 RESTful Web 服务

按照 RESTful 规范,对同一资源(如用户 /user)使用不同的 HTTP 方法实现 CRUD。以下使用虚拟数据库(内存 JSON 数组)演示。

虚拟数据库模块 db.js:
  1. module.exports = (function() {
  2.   let DummyDB = {};
  3.   let storage = [];
  4.   let count = 1;
  5.   DummyDB.get = (id) => {
  6.     if (id) {
  7.       id = (typeof id == 'string') ? Number(id) : id;
  8.       for (let i in storage) {
  9.         if (storage[i].id == id) return storage[i];
  10.       }
  11.     } else {
  12.       return storage;
  13.     }
  14.   };
  15.   DummyDB.insert = (data) => {
  16.     data.id = count++;
  17.     storage.push(data);
  18.     return data;
  19.   };
  20.   DummyDB.remove = (id) => {
  21.     id = (typeof id == 'string') ? Number(id) : id;
  22.     for (let i in storage) {
  23.       if (storage[i].id == id) {
  24.         storage.splice(i, 1);
  25.         return true;
  26.       }
  27.     }
  28.     return false;
  29.   };
  30.   return DummyDB;
  31. })();
复制代码

主服务文件(引入 db.js、cookie-parser、body-parser):
  1. const fs = require('fs');
  2. const express = require('express');
  3. const cookieParser = require('cookie-parser');
  4. const bodyParser = require('body-parser');
  5. const DummyDB = require('./db.js');
  6. let app = express();
  7. app.use(cookieParser());
  8. app.use(bodyParser.urlencoded({ extended: false }));
  9. // 查询所有用户
  10. app.get('/user', (req, res) => {
  11.   res.send(DummyDB.get());
  12. });
  13. // 查询指定用户
  14. app.get('/user/:id', (req, res) => {
  15.   res.send(DummyDB.get(req.params.id));
  16. });
  17. // 添加用户页面
  18. app.get('/addUser', (req, res) => {
  19.   fs.readFile('addUser.html', (err, data) => {
  20.     res.send(data.toString());
  21.   });
  22. });
  23. // 提交添加用户
  24. app.post('/addUser', (req, res) => {
  25.   let name = req.body.name;
  26.   let pass = req.body.pass;
  27.   if (name && pass) {
  28.     res.send(DummyDB.insert({ name: name, pass: pass }));
  29.   } else {
  30.     throw new Error('error');
  31.   }
  32. });
  33. // 删除用户
  34. app.delete('/user/:id', (req, res) => {
  35.   if (DummyDB.remove(req.params.id)) {
  36.     res.send('删除成功');
  37.   } else {
  38.     res.send('删除失败');
  39.   }
  40. });
  41. app.listen(52273, () => {
  42.   console.log('服务器监听地址是 http://127.0.0.1:52273');
  43. });
复制代码

addUser.html 表单内容:
  1. <form method="post">
  2.   <fieldset>
  3.     <legend>登录账户</legend>
  4.     用户名:<input type="text" name="name"/><br/>
  5.     密 码:<input type="password" name="pass"/><br/>
  6.     <input type="submit" value="提交"/>
  7.   </fieldset>
  8. </form>
复制代码

四、使用 express-generator 快速搭建项目

express-generator 是官方应用生成器,可快速创建项目骨架。安装:
  1. npm install -g express-generator
复制代码

创建项目:
  1. cd /path/to/projects
  2. express my_project
复制代码

执行后控制台会提示下一步:安装依赖并启动。
  1. cd my_project
  2. npm install
  3. npm start
复制代码

生成的项目默认包含 package.json、app.js、views 目录(使用模板引擎)、public 静态资源目录等,省去手动搭建基础结构的繁琐。

总结
Express 4.x 通过简洁的 API 和灵活的中间件体系,让 Node.js Web 开发效率大幅提升。掌握 request/response 对象、中间件链、路由设计以及常见第三方中间件(cookie-parser、body-parser)即可应对多数后端场景。结合 RESTful 风格和 express-generator,能快速构建可维护的 API 服务。
回复

使用道具 举报

发表于 昨天 22:10 | 显示全部楼层

Re: Express 4.x实战:中间件、RESTful API与项目生成

非常实用的教程,感谢楼主分享!中间件链和cookie-parser+body-parser组合的例子很清晰,我正好在做一个登录功能,跟着代码试了一下,已经跑起来了。有个小问题想确认一下:示例中`fs.readFile('login.html', ...)`读取的是项目根目录下的文件吗?需不需要特殊配置路径?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-13 01:04 , Processed in 0.030247 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部