Express框架入门

文章目录

    • [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)
  • 中间件的作用就是使用函数封装公共操作,简化代码
    1. 全局中间件
      a. 声明中间件函数
js 复制代码
let recordMiddleware = function(request,response,next){
  //实现功能代码
  //.....
  //执行next函数(当如果希望执行完中间件函数之后,仍然继续执行路由中的回调函数,必须调用next)
  next();
}

b. 应用中间件

js 复制代码
app.use(function (request, response, next) {
    console.log('定义第一个中间件');
    next();
})
  1. 路由中间件
js 复制代码
app.get('/路径',`中间件函数`,(request,response)=>{

});

app.get('/路径',`中间件函数1`,`中间件函数2`,(request,response)=>{

});
  1. 静态资源中间件
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 端口启动....');
});

注意事项:

  1. index.html 文件为默认打开的资源
  2. 如果静态资源与路由规则同时匹配,谁先匹配谁就响应
  3. 路由响应动态资源,静态资源中间件响应静态资源

4. Router

express 中的 Router 是一个完整的中间件和路由系统,可以看做是一个小型的 app 对象

  1. 使用
    创建独立的 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 自动生成
相关推荐
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于Vue的租房App为例,包含答辩的问题和答案
前端·javascript·vue.js
遥望九龙湖1 小时前
打包动态库
开发语言·c++·visualstudio
m0_531237172 小时前
C语言-编程实例2
c语言·开发语言
dreams_dream2 小时前
Python 的 GIL 是什么?有什么影响?
开发语言·python
麻瓜pro2 小时前
【迭代】高性能c++实时对话系统e2e_voice
开发语言·c++·onnxruntime·端到端语音
zjxtxdy2 小时前
C语言(续)
c语言·开发语言
无尽的沉默2 小时前
Thymeleaf 基本语法和表达式
java·开发语言
Coder_Boy_2 小时前
Java后端核心技术体系全解析(个人总结)
java·开发语言·spring boot·分布式·spring cloud·中间件
zh_xuan2 小时前
kotlin Flow的用法2
android·开发语言·kotlin·协程·flow·被压