Node.js开发-express框架

news2025/1/17 23:21:28

express框架

  • 1) 介绍
  • 2) express 路由
  • 3) express 响应设置
  • 4) express 其他响应
  • 5) express中间件
  • 6) 静态资源中间件
  • 7) 获取请求体数据 body-parser
  • 8) Router 路由模块化
  • 9) EJS 模板引擎

1) 介绍

express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架,官方网址:https://www.expressjs.com.cn/

简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用(HTTP 服务)

npm init
npm i express
const express= require("express");

// 2.创建应用对象
const app = express();

// 3.创建路由
app.get("/home", (request, response) => {
    response.end("hello express");
});

// 4.监听端口,启动服务
app.listen(3000, () => {
    console.log("服务已经启动,端口3000正在监听中");
});

2) express 路由

官方定义: 路由确定了应用程序如何响应客户端对特定端点的请求

一个路由的组成有 请求方法路径回调函数 组成

express 中提供了一系列方法,可以很方便的使用路由,使用格式如下:

app.<method>(path,callback)

代码示例:

const express= require("express");

// 2.创建应用对象
const app = express();

// 3.创建路由
app.get("/home", (request, response) => {
    response.end("hello express");
});

app.get("/", (request, response) => {
    response.end("home");
});

app.post("/login", (request, response) => {
    response.end("login login");
});

app.all("/test", (request, response) => {
    response.end("test test");
});

app.all("*", (request, response) => {
    response.end("404 Not found");
});

// 4.监听端口,启动服务
app.listen(3000, () => {
    console.log("服务已经启动,端口3000正在监听中");
});

获取请求参数

express 框架封装了一些 API 来方便获取请求报文中的数据,并且兼容原生 HTTP 模块的获取方式

const express= require("express");

// 创建应用对象
const app = express();

// 创建路由
app.get("/request", (request, response) => {
    // 原生操作
    console.log(request.method);
    console.log(request.url);
    console.log(request.httpVersion);
    console.log(request.headers);

    // express 操作
    console.log(request.path);
    console.log(request.query);
    // 获取ip
    console.log(request.ip);
    // 获取请求头
    console.log(request.get("host"));
    response.end("hello express");
});

// 监听端口,启动服务
app.listen(3000, () => {
    console.log("服务已经启动,端口3000正在监听中");
});

获取路由参数

路由参数指的是 URL 路径中的参数(数据)

const express= require("express");

// 创建应用对象
const app = express();

// 创建路由
app.get("/:id.html", (request, response) => {
    // 获取路由参数
    console.log(request.params.id);
    response.setHeader("content-type", "text/html;charset=utf-8");
    response.end("商品详情");
});

// 监听端口,启动服务
app.listen(3000, () => {
    console.log("服务已经启动,端口3000正在监听中");
});

3) express 响应设置

express 框架封装了一些 API 来方便给客户端响应数据,并且兼容原生 HTTP 模块的获取方式

// 导包
const express= require("express");

// 创建应用对象
const app = express();

// 创建路由
app.get("/response", (request, response) => {
    // 原生响应
//     response.statusCode = 404;
//     response.statusMessage = "Love";
//     response.setHeader("xxx", "yyy");
//     response.write("hello express ");
//     response.end("response");
    
    // express 响应
    // response.status(500);
    // response.set("aaa", "bbb");
    // response.send("你好 express");

    response.status(404).set("xxx", "yyy").send("链式编程");
});

// 监听端口,启动服务
app.listen(3000, () => {
    console.log("服务已经启动,端口3000正在监听中");
});

4) express 其他响应

  • 跳转响应
  • 下载响应
  • JSON响应
  • 文件响应
// 导包
const express= require("express");

// 创建应用对象
const app = express();

// 创建路由
app.get("/other", (request, response) => {   
    // 跳转响应
    // response.redirect("https://www.baidu.com");

    // 下载响应
    // response.download(__dirname + "/package.json");

    // JSON响应
    // response.json({
    //     name: "XXX",
    //     slogon: "天下"
    // });

    // 响应文件内容
    response.sendFile(__dirname + '/2_form.html');
});

// 监听端口,启动服务
app.listen(3000, () => {
    console.log("服务已经启动, 端口3000正在监听中");
});

5) express中间件

什么是中间件

中间件(Middleware)本质是一个回调函数

中间件函数 可以像路由回调一样访问 请求对象(request) , 响应对象(response)

中间件的作用

中间件的作用 就是 使用函数封装公共操作,简化代码

中间件的类型

  • 全局中间件
  • 路由中间件

定义全局中间件

每一个请求 到达服务端之后 都会执行全局中间件函数

在这里插入图片描述

/**
 * 记录每个请求的 url 与 IP地址
 */
const express= require("express");
const fs = require("fs");
const path = require("path");

// 创建应用对象
const app = express();

// 声明中间件函数
function recordMiddleware(request, response, next) {
    // 获取 url 和 ip
    let {url,ip} = request;
    // 将信息那批次早文件中 access.log
    fs.appendFileSync(path.resolve(__dirname, "./access.log"), `${url} ${ip}\r\n`);
    // 调用next
    next();
}

// 使用中间件函数
app.use(recordMiddleware);

// 创建路由
app.get("/home", (request, response) => {
    
    response.send("前台首页");
});

app.get("/admin", (request, response) => {
    response.send("后台首页");
});

app.get("*", (request, response) => {
    response.send("<h1>404 Not Found</h1>");
});

// 监听端口,启动服务
app.listen(3000, () => {
    console.log("服务已经启动,端口3000正在监听中");
});

调用格式如下:

app.use(recordMiddleware);

定义路由中间件

如果 只需要对某一些路由进行功能封装 ,则就需要路由中间件

/**
 * 针对 /admin /setting 的请求,要求 URL 携带 code=521 参数,如未携带提示”“
 */
const e = require("express");
const express= require("express");

// 创建应用对象
const app = express();

// 创建路由
app.get("/home", (request, response) => {
    response.send("前台首页");
});

// 声明中间件
let checkCodeMiddleware = (request, response, next) => {
    // 判断 url 中是否 code=521
    if (request.query.code === "521") {
        next();
    } else {
        response.send("暗号错误");
    }
};

app.get("/admin", checkCodeMiddleware, (request, response) => {
    response.send("后台首页");
});

app.get("/setting", checkCodeMiddleware, (request, response) => {
    response.send("设置页面");
});

app.get("*", (request, response) => {
    response.send("<h1>404 Not Found</h1>");
});

// 监听端口,启动服务
app.listen(3000, () => {
    console.log("服务已经启动,端口3000正在监听中");
});

调用格式如下:

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

6) 静态资源中间件

express 内置处理静态资源的中间件

const express= require("express");

// 创建应用对象
const app = express();

// 静态资源中间件设置
app.use(express.static(__dirname + '/public'));

// 创建路由
app.get("/home", (request, response) => {
    response.end("hello express");
});

// 监听端口,启动服务
app.listen(3000, () => {
    console.log("服务已经启动,端口3000正在监听中");
});

注意事项:

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

7) 获取请求体数据 body-parser

express 可以使用 body-parser 包处理请求体

第一步:安装

npm i body-parser

第二步:导入 body-parser 包

const bodyParser = require('body-parser');

第三步:获取中间件函数

//处理 querystring 格式的请求体
let urlParser = bodyParser.urlencoded({extended:false}));
//处理 JSON 格式的请求体
let jsonParser = bodyParser.json();

第四步:设置路由中间件,然后使用 request.body 来获取请求体数据

app.post('/login', urlParser, (request,response)=>{
    //获取请求体数据
    //console.log(request.body);
    //用户名
    console.log(request.body.username);
    //密码
    console.log(request.body.userpass);
    response.send('获取请求体数据');
});

获取到的请求体数据:

[Object: null prototype] { username: 'admin', userpass: '123456' }

完整代码

/**
 * GET  /login 显示表单网页
 * POST /login 获取表单中的“用户名”和“密码”
 */
const express= require("express");
const bodyParser = require('body-parser');

// 创建应用对象
const app = express();

// 解析json格式的请求体的中间件
const jsonParse = bodyParser.json();

// 解析querystring格式的请求体的中间件
const urlencodeParser = bodyParser.urlencoded({extended: false});

// 创建路由规则
app.get("/login", (request, response) => {
    // response.send("表单页面");
    response.sendFile(__dirname + "/11_form.html");
});

app.post("/login", urlencodeParser, (request, response) => {
    // 获取用户名和密码
    console.log(request.body);
    console.log(request.body.username);
    console.log(request.body.password);
    response.send("获取用户的数据");
});

// 监听端口,启动服务
app.listen(3000, () => {
    console.log("服务已经启动, 端口3000正在监听中");
});

8) Router 路由模块化

什么是 Router

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

Router 作用

对路由进行模块化,更好的管理路由

Router 使用

创建独立的 JS 文件(router/homeRouter.js)(router/adminRouter.js)

// router/homeRouter.js
const express = require("express");

// 创建路由对象
const router = express.Router();

// 创建路由规则
router.get("/home", (request, response) => {
    response.send("前台首页");
});

router.get("/search", (request, response) => {
    response.send("内容搜索");
});

// 暴露 router
module.exports = router;
// router/adminRouter.js
const express = require("express");

// 创建路由对象
const router = express.Router();

// 创建路由规则
router.get("/admin", (request, response) => {
    response.send("后台首页");
});

router.get("/setting", (request, response) => {
    response.send("设置页面");
});

// 暴露 router
module.exports = router;

主文件

const express= require("express");
const homeRouter = require("./routes/homeRouter");
const adminRouter = require("./routes/adminRouter");

// 创建应用对象
const app = express();

// 设置
app.use(homeRouter);
app.use(adminRouter);

app.get("*", (request, response) => {
    response.send("<h1>404 Not Found</h1>");
});

// 监听端口,启动服务
app.listen(3000, () => {
    console.log("服务已经启动,端口3000正在监听中");
});

9) EJS 模板引擎

什么是模板引擎

模板引擎是分离 用户界面和业务数据 的一种技术

什么是 EJS

EJS 是一个高效的 Javascript 的模板引擎

官网: https://ejs.co/

中文站:https://ejs.bootcss.com/

EJS 初体验

下载安装EJS

npm i ejs --save

代码示例

// 导入ejs
const ejs = require("ejs");

// 字符串
let china = "中国";
let str = "我爱你";

// 使用 ejs 渲染
    let result = ejs.render("我爱你 <%= china %>", {china: china});

console.log(result);

命令行下运行

EJS 常用语法

执行JS代码

<% code %>

输出转义的数据到模板上

<%= code %>

输出非转义的数据到模板上

<%- code %>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1450103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL学习记录——팔 函数

文章目录 1、日期函数2、字符串函数3、数学函数4、其它函数 1、日期函数 //获取日期 select current_date(); //获取时间 select current_time(); //获取时间戳, 格式为日期时间 select current_timestamp(); //获取当前时间, 格式为日期时间 select now(); //获取参数的日期部…

单html页面使用Vue3和Element-Plus

一、快速入门 使用CDN方式引入Vue3使用CDN方式引入Element-Plus的样式文件和组件库 案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, ini…

Linux学习(二)Makefile与GCC

程序运行步骤&#xff0c;预处理->预编译->编译->链接 1.预处理 gcc -E 文件名&#xff0c;生成的文件不会存储&#xff0c;可以重定向 > 到另一个文件中 2.编译 gcc -c *.c -o *.o 编译生成的文件为.o 可以将它编译为汇编 gcc -S 文件名 3.链接 gcc *.o *.…

投资银行在网络安全生态中的作用

文章目录 一、投资银行的含义(一)并购买方。(二)并购卖方。(三)IPO辅助。(四)投资银行业务的另一方面是帮助这些交易融资。二、从投资银行角度看网络安全产业(一)行业的短期前景三、复杂的网络安全并购(一)行业知识对投资银行业务很重要(二)在网络安全领域,技术…

《区块链公链数据分析简易速速上手小册》第8章:实战案例研究(2024 最新版)

文章目录 8.1 案例分析&#xff1a;投资决策支持8.1.1 基础知识8.1.2 重点案例&#xff1a;股票市场趋势预测准备工作实现步骤步骤1: 加载和准备数据步骤2: 特征工程步骤3: 训练模型步骤4: 评估模型 结论 8.1.3 拓展案例 1&#xff1a;基于情感分析的投资策略准备工作实现步骤步…

【Python】通过conda安装Python的IDE

背景 系统&#xff1a;win11 软件&#xff1a;anaconda Navigator 问题现象&#xff1a;①使用Navigator安装jupyter notebook以及Spyder IDE 一直转圈。②然后进入anaconda prompt执行conda install jupyter notebook一直卡在Solving environment/-\。 类似问题&#xff1a; …

专业140+总分420+东北大学841通信专业基础考研经验东大电子信息与通信工程,真题,大纲,参考书。

今年考研顺利上岸&#xff0c;被东北大学通信工程录取&#xff0c;其中专业课841通信专业基础140&#xff0c;数二140&#xff0c;总分420&#xff0c;整体每门课都还是比较均衡&#xff0c;刚开始考研前也和大家一样&#xff0c;焦虑&#xff0c;紧张&#xff0c;面对考研怕失…

软件测试【三】Python中的数据类型

一、Python中的数据类型: python中的list列表定义 在Python中&#xff0c;list是一种有序的数据类型&#xff0c;可以存储任意类型的对象&#xff0c;包括数字、字符串、布尔值、函数等。 定义一个list列表可以使用中括号[]来表示&#xff0c;其中每个元素之间用逗号隔开。以…

VitePress-16- 配置- head 的配置网页icon与插入一个script标签

作用说明 head 配置项&#xff0c;可以在页面 HTML 的 <head> 标签中呈现的其他元素。 用户添加的标签在结束 head 标签之前呈现&#xff0c;在 VitePress 标签之后。说白了&#xff0c;就是自定义一些 head 标签中的元素&#xff0c;例如 &#xff1a;页面的icon等。 由…

【分享】图解ADS+JLINK调试ARM

文章是对LPC2148而写的&#xff0c;但是对三星的44B0芯片同样适用&#xff0c;只需要在选择时将相应的CPU选择的S3C44B0就可以了。 JLINK在ADS下调试心得 前两天一个客户用jlink在ADS下调试LPC2148总报错&#xff0c;这个错误我之前在调试LPC2200的时候也碰到过&#xff0c;后…

基于JAVA,SpringBoot和Vue二手房屋销售系统设计

摘要&#xff1a; 本研究旨在设计并实现一个基于JAVA, SpringBoot和Vue技术的二手房屋销售系统。该系统采用当前流行的前后端分离架构&#xff0c;后端使用SpringBoot框架快速搭建RESTful API&#xff0c;提供稳定且高效的服务端应用&#xff1b;前端则通过Vue.js框架构建动态…

【AIGC】Stable Diffusion的生成参数入门

Stable Diffusion 的生成参数是用来控制图像生成过程的重要设置&#xff0c;下面是一些常见的生成参数及其详解 1、采样器&#xff0c;关于采样器的选择参照作者的上一篇文章 2、采样步数&#xff08;Sampling Steps&#xff09;是指在生成图像时模型执行的总步数&#xff0c…

问题:规范化过程主要为克服数据库逻辑结构中的插入异常、删除异常以及(??)的缺陷. #职场发展#职场发展#知识分享

问题&#xff1a;规范化过程主要为克服数据库逻辑结构中的插入异常、删除异常以及(??)的缺陷. 参考答案如图所示

春节专题|产业7问:区块链厂商的现在和未来——混合技术厂商

2023转瞬即逝&#xff0c;不同于加密领域沉寂一整年后在年末集中爆发&#xff0c;对于我国的区块链厂商而言&#xff0c;稳中求胜才是关键词&#xff0c;在平稳发展的基调下&#xff0c;产业洗牌也悄无声息的到来。 从产业总体而言&#xff0c;在经过了接近3年的快速发展后&…

[word] word保存了但是再打开就没有了怎么办 #职场发展#其他

word保存了但是再打开就没有了怎么办 word保存了但是再打开就没有了怎么办&#xff1f; 一些朋友反映常常找不到自己保存在电脑中的Word的文档&#xff0c;不知道是怎么回事。如果是突然消失的&#xff0c;其实情况还是有很多种&#xff0c;相信大家也有一定的了解。在这里&a…

前端秘法基础式(HTML)(第二卷)

目录 一.表单标签 1.表单域 2.表单控件 2.1input标签 2.2label/select/textarea标签 2.3无语义标签 三.特殊字符 一.表单标签 用来完成与用户的交互,例如登录系统 1.表单域 <form>通过action属性,将用户填写的数据转交给服务器 2.表单控件 2.1input标签 type…

Linux操作系统基础(十二):yum软件包管理器

文章目录 yum软件包管理器 一、yum常用命令 二、yum在线安装软件案例 三、yum在线删除软件案例 yum软件包管理器 yum&#xff08; Yellow dog Updater, Modified&#xff09;是一个在 Fedora 和 RedHat中的 Shell 前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的…

开窗,挖槽,放电齿,拼版

我们在阻焊层画线&#xff0c;就相当于去掉绿油阻焊&#xff0c;开窗一般是用在大电流走线的时候。先画要走的导线&#xff0c;之后切换到TopSolder或者Bottom Solder层&#xff0c;然后Place->line 画一条和原来先粗细一样的线即可&#xff01;但走电流的仍然是导线&#x…

字符输入/输出和输入验证 DAY19

文章目录 前言一、单字符I/O二、缓冲区为什么要引入缓冲区&#xff1f;文件结尾补充**注意几点** 重定向和文件重定向输入cmd是什么&#xff1f;重定向输出组合重定向小试牛刀&#xff1a;文件输出 创建更友好的用户界面使用缓冲输入 如果您发现文章有错误请与我留言&#xff0…

Linux多线程[二]

线程同步 一个资源&#xff0c;我们不知道他是不是准备好了资源&#xff0c;就需要频繁申请。这时候对于这个执行流&#xff0c;多次检测&#xff0c;极大的浪费了资源。而且对于资源来说一个线程多次申请资源的时候&#xff0c;他一直申请到资源&#xff0c;别的线程申请不到…