Express 是 Node.js 生态中最流行的 Web 框架,基于内置 http 模块封装了更简洁的 API 和强大的中间件机制。本文从基础用法入手,逐步深入到中间件链、RESTful 接口设计以及使用 express-generator 快速搭建项目,所有代码均基于 Express 4.x 版本。
一、Express 基础与请求/响应对象
安装 Express 4.x:
创建最简服务器(监听 52273 端口):- const express = require('express');
- const app = express();
- app.listen(52273, () => {
- console.log('服务器监听地址是 http://127.0.0.1:52273');
- });
复制代码
1. 响应对象 response
response.send() 会根据传入参数类型自动返回合适格式:
- 字符串 → HTML
- 数组/对象 → JSON
示例:返回一个数组,浏览器自动收到 JSON:- app.use((req, res) => {
- let output = [];
- for (let i = 0; i < 3; i++) {
- output.push({ count: i, name: 'name - ' + i });
- }
- res.send(output);
- });
复制代码
2. 请求对象 request
常用属性:params(路由参数)、query(URL 查询变量)、headers(请求头)。
示例:根据 User-Agent 判断浏览器类型:- app.use((req, res) => {
- let agent = req.header('User-Agent');
- if (agent.toLowerCase().match(/chrome/)) {
- res.send('<h1>*_*欢迎使用谷歌浏览器</h1>');
- } else {
- res.send('<h1>^_^您使用的不是谷歌浏览器,当然这并不影响浏览网页</h1>');
- }
- });
复制代码
二、中间件机制
Express 中间件通过 app.use() 注册,格式:app.use([path,] callback[, callback])。多个中间件通过 next() 串联执行。
示例:中间件传递变量:- app.use((req, res, next) => {
- req.number = 20;
- res.number = 35;
- next();
- });
- app.use((req, res) => {
- res.send('<h1 style="color:green">' + req.number + ' : ' + res.number + '</h1>');
- });
复制代码
常用中间件:
- router:处理路由
- static:托管静态文件
- morgan:日志
- cookie-parser:处理 Cookie
- body-parser:解析 POST 请求体
1. router 中间件
取代 http 模块中的 if-else 路由判断,直接用 app.get()/app.post() 等。
路由参数示例:- app.get('/page/:id', (req, res) => {
- let name = req.params.id;
- res.send('<h2 style="color:red">' + name + ' Page</h2>');
- });
复制代码
2. static 中间件(内置)
用于托管图片、CSS、JS 等静态文件:- app.use(express.static(__dirname + '/image'));
- // 之后可直接通过路径访问 /image 下的文件,例如 /82.jpg
复制代码
3. cookie-parser 中间件
先安装:- npm install cookie-parser
复制代码
设置无签名中间件,读写 Cookie:- const cookieParser = require('cookie-parser');
- app.use(cookieParser());
- app.get('/', (req, res) => {
- res.cookie('string', 'cookie');
- res.cookie('json', { name: 'cookie', property: 'delicious' });
- res.send(req.cookies);
- });
复制代码
4. body-parser 中间件
用于解析 POST 请求体(如 form 提交),需安装:
常用方法:bodyParser.urlencoded({ extended: false }) 用于解析 application/x-www-form-urlencoded 数据;bodyParser.json() 解析 JSON。
登录验证综合示例(使用 cookie-parser + body-parser + 文件读取):- const fs = require('fs');
- const express = require('express');
- const cookieParser = require('cookie-parser');
- const bodyParser = require('body-parser');
- let app = express();
- app.use(cookieParser());
- app.use(bodyParser.urlencoded({ extended: false }));
- app.get('/', (req, res) => {
- if (req.cookies.auth) {
- res.send('<h1 style="color:red;text-align: center">登录成功</h1>');
- } else {
- res.redirect('/login');
- }
- });
- app.get('/login', (req, res) => {
- fs.readFile('login.html', (err, data) => {
- res.send(data.toString());
- });
- });
- app.post('/login', (req, res) => {
- let login = req.body.login;
- let pass = req.body.pass;
- if (login == 'mingrisoft' && pass == '123456') {
- res.cookie('auth', true);
- res.redirect('/');
- } else {
- res.redirect('/login');
- }
- });
- app.listen(52273);
复制代码
login.html 文件:- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>登录页面</title>
- </head>
- <body>
- <form method="post">
- <fieldset style="width: 250px;margin: 0 auto;padding:20px">
- <legend style="color:#ff5722">管理员登录</legend>
- <table>
- <tr>
- <td><label for="user">账 号:</label></td>
- <td><input type="text" name="login" id="user"/></td>
- </tr>
- <tr height="40">
- <td><label for="pass">密 码:</label></td>
- <td><input type="password" name="pass" id="pass"/></td>
- </tr>
- <tr>
- <td colspan="2" align="center">
- <input type="submit" style="background: #41d7ea;width: 85px;height: 25px;border: 1px solid #e0ac5e;outline: none;border-radius: 5px;"/>
- </td>
- </tr>
- </table>
- </fieldset>
- </form>
- </body>
- </html>
复制代码
三、实现 RESTful Web 服务
按照 RESTful 规范,对同一资源(如用户 /user)使用不同的 HTTP 方法实现 CRUD。以下使用虚拟数据库(内存 JSON 数组)演示。
虚拟数据库模块 db.js:- module.exports = (function() {
- let DummyDB = {};
- let storage = [];
- let count = 1;
- DummyDB.get = (id) => {
- if (id) {
- id = (typeof id == 'string') ? Number(id) : id;
- for (let i in storage) {
- if (storage[i].id == id) return storage[i];
- }
- } else {
- return storage;
- }
- };
- DummyDB.insert = (data) => {
- data.id = count++;
- storage.push(data);
- return data;
- };
- DummyDB.remove = (id) => {
- id = (typeof id == 'string') ? Number(id) : id;
- for (let i in storage) {
- if (storage[i].id == id) {
- storage.splice(i, 1);
- return true;
- }
- }
- return false;
- };
- return DummyDB;
- })();
复制代码
主服务文件(引入 db.js、cookie-parser、body-parser):- const fs = require('fs');
- const express = require('express');
- const cookieParser = require('cookie-parser');
- const bodyParser = require('body-parser');
- const DummyDB = require('./db.js');
- let app = express();
- app.use(cookieParser());
- app.use(bodyParser.urlencoded({ extended: false }));
- // 查询所有用户
- app.get('/user', (req, res) => {
- res.send(DummyDB.get());
- });
- // 查询指定用户
- app.get('/user/:id', (req, res) => {
- res.send(DummyDB.get(req.params.id));
- });
- // 添加用户页面
- app.get('/addUser', (req, res) => {
- fs.readFile('addUser.html', (err, data) => {
- res.send(data.toString());
- });
- });
- // 提交添加用户
- app.post('/addUser', (req, res) => {
- let name = req.body.name;
- let pass = req.body.pass;
- if (name && pass) {
- res.send(DummyDB.insert({ name: name, pass: pass }));
- } else {
- throw new Error('error');
- }
- });
- // 删除用户
- app.delete('/user/:id', (req, res) => {
- if (DummyDB.remove(req.params.id)) {
- res.send('删除成功');
- } else {
- res.send('删除失败');
- }
- });
- app.listen(52273, () => {
- console.log('服务器监听地址是 http://127.0.0.1:52273');
- });
复制代码
addUser.html 表单内容:- <form method="post">
- <fieldset>
- <legend>登录账户</legend>
- 用户名:<input type="text" name="name"/><br/>
- 密 码:<input type="password" name="pass"/><br/>
- <input type="submit" value="提交"/>
- </fieldset>
- </form>
复制代码
四、使用 express-generator 快速搭建项目
express-generator 是官方应用生成器,可快速创建项目骨架。安装:- npm install -g express-generator
复制代码
创建项目:- cd /path/to/projects
- express my_project
复制代码
执行后控制台会提示下一步:安装依赖并启动。- cd my_project
- npm install
- 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 服务。 |