文章目录
-
- [1. Express 使用](#1. Express 使用)
- [2. express 路由](#2. express 路由)
-
- [2.1 获取路由参数](#2.1 获取路由参数)
- [2.2 获取请求参数](#2.2 获取请求参数)
- [3. express 响应设置](#3. express 响应设置)
- [4. express 中间件](#4. express 中间件)
- [4. Router](#4. Router)
- [5. Express 与其他框架之间区别](#5. Express 与其他框架之间区别)
express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架,简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用(HTTP 服务)
1. Express 使用
js
//1. 导入 express
const express = require('express');
//2. 创建应用对象
const app = express();
//3. 创建路由规则
app.get('/home', (req, res) => {
res.end('hello express server');
});
//4. 监听端口 启动服务
app.listen(3000, () =>{
console.log('服务已经启动, 端口监听为 3000...');
});
2. express 路由
路由确定了应用程序如何响应客户端对特定端点的请求
格式:app.<method>(path,callback)
示例:
js
//导入
expressconst express = require('express');
//创建应用对象
const app = express();
//创建 get 路由
app.get('/home', (req, res) => {
res.send('网站首页');
});
//首页路由
app.get('/', (req,res) => {
res.send('我才是真正的首页');
});
//创建 post 路由
app.post('/login', (req, res) => {
res.send('登录成功');
});
//匹配所有的请求方法
app.all('/search', (req, res) => {
res.send('1 秒钟为您找到相关结果约 100,000,000 个');
});
//自定义 404 路由
app.all("*", (req, res) => {
res.send('<h1>404 Not Found</h1>')
});
//监听端口 启动服务
app.listen(3000, () =>{
console.log('服务已经启动, 端口监听为 3000');
});
2.1 获取路由参数
路由参数指的是 URL 路径中的参数(数据)
js
app.get('/:id.html', (req, res) => {
res.send('商品详情, 商品 id 为' + req.params.id);
});
2.2 获取请求参数
js
//导入
expressconst express = require('express');
//创建应用对象
const app = express();
//获取请求的路由规则
app.get('/request', (req, res) => {
// 1. 获取报文的方式与原生 HTTP 获取方式是兼容的
console.log(req.method);
console.log(req.url);
console.log(req.httpVersion);
console.log(req.headers);
// 2. express 独有的获取报文的方式
// 获取路径
console.log(req.path)
//获取查询字符串
console.log(req.query);
// 获取指定的请求头
console.log(req.get('host'));
res.send('请求报文的获取');
});
//启动服务
app.listen(3000, () => {
console.log('启动成功....')
})
3. express 响应设置
js
//获取请求的路由规则
app.get("/response", (req, res) => {
//1. express 中设置响应的方式兼容 HTTP 模块的方式
res.statusCode = 404;
res.statusMessage = 'xxx';
res.setHeader('abc','xyz');
res.write('响应体');
res.end('xxx');
//2. express 的响应方法
res.status(500); //设置响应状态码
res.set('xxx','yyy');//设置响应头
res.send('中文响应不乱码');//设置响应体
//连贯操作
res.status(404).set('xxx','yyy').send('你好朋友')
//3. 其他响应
res.redirect('http://atguigu.com')//重定向
res.download('./package.json');//下载响应
res.json();//响应 JSON
res.sendFile(__dirname + '/home.html') //响应文件内容
});
4. express 中间件
- 中间件(Middleware)本质是一个回调函数,可以像路由回调一样访问请求对象(request),响应对象(response)
- 中间件的作用就是使用函数封装公共操作,简化代码
- 全局中间件
a. 声明中间件函数
- 全局中间件
js
let recordMiddleware = function(request,response,next){
//实现功能代码
//.....
//执行next函数(当如果希望执行完中间件函数之后,仍然继续执行路由中的回调函数,必须调用next)
next();
}
b. 应用中间件
js
app.use(function (request, response, next) {
console.log('定义第一个中间件');
next();
})
- 路由中间件
js
app.get('/路径',`中间件函数`,(request,response)=>{
});
app.get('/路径',`中间件函数1`,`中间件函数2`,(request,response)=>{
});
- 静态资源中间件
js
//引入express框架
const express = require('express');
//创建服务对象
const app = express();
//静态资源中间件的设置,将当前文件夹下的public目录作为网站的根目录
app.use(express.static('./public'));
app.get('/index.html',(request,response)=>{
respsonse.send('首页');
});
//监听端口
app.listen(3000,()=>{
console.log('3000 端口启动....');
});
注意事项:
- index.html 文件为默认打开的资源
- 如果静态资源与路由规则同时匹配,谁先匹配谁就响应
- 路由响应动态资源,静态资源中间件响应静态资源
4. Router
express 中的 Router 是一个完整的中间件和路由系统,可以看做是一个小型的 app 对象
- 使用
创建独立的 JS 文件(homeRouter.js)
js
//1. 导入 express
const express = require('express');
//2. 创建路由器对象
const router = express.Router();
//3. 在 router 对象身上添加路由
router.get('/', (req, res) => {
res.send('首页');
})
router.get('/cart', (req, res) => {
res.send('购物车');
});
//4. 暴露
module.exports = router;
主文件
js
const express = require('express');
const app = express();
//5.引入子路由文件
const homeRouter = require('./routes/homeRouter');
//6.设置和使用中间件
app.use(homeRouter);
app.listen(3000,()=>{
console.log('3000 端口启动....');
})
5. Express 与其他框架之间区别
| 维度 | Express | Koa | Egg.js | NestJS |
|---|---|---|---|---|
| 核心定位 | 最薄层 HTTP/Connect 兼容库 | 新一代洋葱模型 HTTP 内核 | 企业级 B 端框架(阿里内部孵化) | 面向企业平台的 IOC + AOP 运行时 |
| 运行时抽象 | 无抽象,request/response 裸对象 | 封装 context,统一 req/res | 在 Koa context 上追加 egg.* 运行时 | 基于平台 Adapter,屏蔽 HTTP/TCP/WebSocket/GraphQL |
| 异步策略 | 回调(v5 实验性支持 async) | 原生 async/await,洋葱圈 | 继承 Koa2,统一 async/await | 强制 async/await,拦截器链完全 Promise 化 |
| 中间件模型 | 线性队列,next() 手动传递 | 洋葱圈,可多次 yield | 洋葱圈 + 内置 10+ 默认中间件 | 中间件 + Guard/Interceptor/Pipe/Filter 四级 AOP 链 |
| 路由系统 | 正则路径(path-to-regexp) | 需引入 koa-router 等 | 约定式目录路由,可动态 reload | 装饰器元数据路由,支持版本号、全局前缀、版本策略 |
| 依赖注入 | 无 | 无 | 无 | 自实现 IoC Container(@Injectable),支持 Scope 链与生命周期钩子 |
| 配置与插件 | 无约定,自由 require | 无约定,自由 require | Plugin + Config 多环境合并,支持 plugin.js 声明 | ConfigModule 支持 env、dotenv、consul、k8s ConfigMap 热加载 |
| TypeScript 支持 | 社区 @types,类型零散 | 社区 @types,类型零散 | egg-ts 编译时生成 d.ts,运行时装载 | 源码即 TS,反射元数据驱动,支持 Swagger 自动生成 |