Express基于Node.js基础知识【2】全面总结 推荐

news2024/12/23 15:00:19

最近在用基于node.js平台的web应用开发做项目,梳理了下关于Express框架的相关知识,方便自己以后查看,希望也能帮助证字啊学习express相关知识的同学,欢迎大家参考,有问题评论区留言,谢谢。

Node.js下载安装配置请参考:Node.js 下载安装配置 超详细-CSDN博客


目录

1.响应动态页面

1.安装ejs模板引擎

2.在express中使用ejs模板引擎

3.ejs的常用知识点

2.路由

3.Express中App级中间件

3.1 use中间件

3.2 METHOD()和all() 中间件

4.Router级中间件

4.1 Router级中间件use()

4.2 router中间件的应用 

5、Express内置中间件

6.第三方中间件

7.错误处理中间件


1.响应动态页面

1.安装ejs模板引擎
  1. 输入 npm install ejs 安装ejs
  2. 安装成功后可以看到 package.json文件 有对应的版本信息
D:\CODE\VSCODE\node\express\course> npm install ejs 

2.在express中使用ejs模板引擎

2.1使用默认文件渲染模板

在项目中新建views>user.ejs 文件,ejs文件和html类似,我们试图用变量id 即请求返回的数据展示到页面上。

我们在postman中测试一下,我们通过get/user请求 ,结果返回一个user.ejs页面。可以看到成功返回了。

2.2 配置模板动态渲染页面

如果模板目录不是views的话不设置会报错的。

把默认模板设置成对应的模板就可以了。

设置默认的模板后缀名 这样在渲染模板的时候就可以省略了。

设置指定后缀名文件,比如把文件格式设置成html文件。

3.ejs的常用知识点

ejs如何获取变量的值,遍历数组对象,展示html的信息。

引入其他页面文件 include

2.路由

router可以帮助我们处理有关路由相关的操作,我们就不需要在app上面处理了,可以按照业务需求分类来新建路由,更好的管理代码。代码更规范。

新建user路由文件 router> user.js 文件最后将路由router导出。

const express = require('express');
const router = express.Router()

//用户登录
router.post('/login',(req,res) => {
    res.send('登录成功 userRouter')
})

//用户注册
router.post('/register',(req,res) => {
    res.send('注册成功 userRouter')
})

module.exports = router

index.js中部分代码

// userRouter是从router/user文件中引入
const userRouter = require('./router/user')

app.use('/user',userRouter)

结果展示如下:

3.Express中App级中间件

中间件是什么?

中间件是express的核心。中间件是函数,是express调用的函数,调用时会被express传入三个参数,res req next。

3.1 use中间件
//1.use中间件
//使用app.use()方法将中间件提供给express调用
//use()该方法第一个参数默认是/ 可以省略
//use()可以匹配所有的HTTP 方法
//use()匹配路径的规则为:从头包含匹配
app.use((req,res,next) => {
    console.log('use1中间件')
    next()
})

app.use('/',(req,res,next) => {
    console.log('use1中间件')
    //next()
    res.send('hello')
})

//可以给同一个路径或者 同一个use()注册多个中间件函数
app.use('/',
    (req,res,next) => {
        console.log('use1中间件')
        //next()
        res.send('hello')
    },
    (req,res,next) => {
        console.log('use1中间件')
        //next()
        res.send('hello')
    }
)

3.2 METHOD()和all() 中间件
  1. METHOD()具体指:app.get() app.post() app.put() app.delete()等

  2. METHOD()方法会匹配对应的http方法,all()方法会匹配所有Http方法

  3. METHOD()或all()方法匹配路径的规则:相等匹配

  4. 可以给同一个路径注册多个中间件函数

  5. 可以在一个METHOD()或all() 方法中注册多个中间件函数

4.App中间件的应用

处理application/x-www-form-urlencoded数据

新建middleware文件夹> urlencoded.js文件

const querystring = require('node:querystring')
module.exports = () => {
    (req,res,next) => {
        if(req.header('Content-Type')!=='application/x-www-form-urlencoded'){
            return next()
        }
        const results = []
        req.on('data',chunk=>{
            results.push(chunk)
        })
        req.on('end',() => {
            const data = Buffer.concat(results).toString()
            req.body = querystring.parse(data)
            next()
        })
    }
}

index.js文件

const urlencoded = require('./middleware/urlencoded')
app.use(urlencoded())

app.post('/user',(req,res)=>{
    console.log(req.body)
})

处理application/json数据

直接写在index.js文件中

index.js代码

//处理请求体中application/json数据
app.use((req,res,next) => {
    // console.log(req.header('Content-Type'))
    if(req.header('Content-Type')!=='application/json'){
        return next()
    }

    const results = []
    req.on('data',chunk=>{
        results.push(chunk)
    })
    req.on('end',() => {
        const data = Buffer.concat(results).toString()
        req.body = JSON.parse(data)
        next()
    })
})

app.post('/user',(req,res)=>{
    console.log(req.body)
})

4.Router级中间件

4.1 Router级中间件use()
//router中间件 use
const router = express.Router()
router.use((req,res,next) => {
    console.log('输出中间件')
    next()
})
app.use('/',router)

router中的method()和all() 和 app中间件中的method() 类似。这里next(router)会跳到匹配的路由。

router.get('/',(req,res,next)=>{
    console.log('输出get')
    next('route')
})

4.2 router中间件的应用 

主要时两个文件index.js 和路由user.js 文件 

//index.js文件

const userRouter = require('./router/user')
app.use('/user',userRouter)
// user.js文件
const express = require('express');
const router = express.Router()

//用户注册
const validate = (req,res,next) => {
    //校验数据
    if(true) {
        console.log('数据校验通过')
        next()
    }else{
        //报错

    }
}

const userMustNotExit = (req,res,next) => {
    if(true) {
        console.log('可以注册新用户')
        next()
    }else{
        //报错

    }
}

const encryptPassword = (res,req,next) => {
    console.log('密码已加密')
    next()
}

const register = (res,req,next) => {
    console.log('注册成功')
    res.send('注册成功')
}

router.post('/register',validate,userMustNotExit,encryptPassword,register)
module.exports = router

5、Express内置中间件

  1. 处理请求体中application/x-www-form-urlencode格式数据
  2. 处理请求体中 application/json 格式的数据
  3. 提供静态资源

6.第三方中间件

第三方插件 cookie-parser 插件安装

npm install cookie-parser

具体用法如下图所示。

7.错误处理中间件

这里用前面router中间件 user.js文件,当用户未填写时,打印一个错误信息

可以看到当执行到next(new Error() ) 信息时,成功打印了错误信息。

到这里我们基于Node.js平台 Express框架 的基础知识就都在文档中了。


总共时两篇,关于Express框架入门的其他知识请参考:Express基于Node.js基础知识【1】全面总结 推荐收藏-CSDN博客

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

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

相关文章

Java答题系统练习模拟考试系统小程序源码

🌟【提分神器】答题系统练习,模拟考试新体验📚 🚀【开篇引入:解锁高效学习新方式】🚀 Hey小伙伴们,是不是每次临近考试都紧张得手心冒汗,生怕知识点掌握不牢固?别怕&am…

【C语言】C语言期末突击/考研--选择、循环语句

目录 一、知识点 1、关系表达式与逻辑表达式 2、if-else语句 3、while循环 4、for循环 5、continue语句 6、break语句 二、练习题 解析: 一、知识点 1、关系表达式与逻辑表达式 我们控制程序执行逻辑运算需要选择和循环结构,那么我们首先来讲选…

24年保研暑假:编程细节和方法(1.二分查找 2.快速幂 3.领接矩阵 4.有序集合的范围查找 5.查找容器内最大最小值 6.含边界位置遍历方案)

文章目录 1.二分查找mid防溢出2.快速幂扩展3.vector实现领接矩阵4.有序集合的范围查找5.查找容器内最大最小值6.含边界位置遍历方案 1.二分查找mid防溢出 我们通常写二分求mid,一般这样写: int mid (right - left >> 1) left;原因在于两个正整…

安装Ubuntu系统+深度学习服务器配置+多用户操作+远程

安装Ubuntu系统深度学习服务器配置多用户操作 安装Ubuntu系统深度学习服务器配置多用户操作 嗨,我是射手座的程序媛,期待和大家更多的交流与学习,欢迎添加3512724768。 安装Ubuntu系统 下载你想要安装的系统的镜像文件(我选择的…

算法板子:DFS的应用——八皇后

对角线的推算,如下图: 代码中的数组解释: place[i]代表第i行皇后放在哪一列; 比如place[0]1代表第0行皇后放在第1列col[i]代表第i列有没有放皇后; 比如col[0]false代表第0列没有放皇后dg[i]代表第i条对角线有没有放皇后; 比如dg[0]false代表第…

[SPON IP]网络对讲广播系统的命令执行漏洞实验

产品简介 世邦通信 SPON IP网络对讲广播系统采用领先的IPAudio技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 ----------------------------------- 漏洞描述 世邦通信 SPON IP网络对讲广播系统 ping.php 存在任意命令执行漏洞,攻…

邮件发送失败rdns报错问题排查解决的策略?

邮件服务中RDNS配置不当导致发送失败,怎样调整设置? 邮件发送失败是一个常见的问题,尤其是当涉及到rdns报错时,这一问题变得尤为复杂。AokSend将详细探讨邮件发送失败的常见原因,并提供有效的排查和解决策略。 邮件发…

【MySQL】事务 【上】{事务的版本支持 事务提交方式 实验结论 用户问题 如何理解隔离性 隔离级别 查看与设置隔离性 四种隔离级别的场景 }

文章目录 1.引入事务事务的版本支持事务提交方式实验结论用户问题 2.隔离性如何理解隔离性隔离级别查看与设置隔离性 4.四种隔离级别的场景读未提交读已提交可重复读串行化 1.引入事务 当客户端A检查还有一张票时,将票卖掉,还没有执行更新数据库的时候&a…

CS61C | lecture6

Lecture 6 主流 ISA Register 汇编语言没有变量。它用寄存器来存储值。 寄存器是固定大小的小内存(32 位或者 64 位)。可以进行读取和写入,但是有数量限制,它们很快并且耗电少。 Registers vs. Memory What if more variables than registers? 如果…

Linux系统将Mint 便签源码打包成deb包并进行安装

网上有提供Ubuntu安装Mint便签的命令,此处不再赘述。而是通过Github Mint便签的说明书,对Mint便签的源码打包成deb包并进行安装。作为练习,方便以后对其他源码进行打包安装。 一、Mint Sticky的介绍 Sticky是一款适用于Linux桌面的笔记应用…

任何值得发表的学术论文,一定要具备一些基础的特性

1. 科学价值:论文的心脏 首先,你的论文需要有“心”——科学价值。这意味着你的研究要么发现了新大陆,要么采用了新方法,要么提供了新视角,或者至少突破了现有局限。记住,你的论文要给科学界带来新的血液&…

预览 txt,ppt,图片,word 等

1.引入查看的封装的组件 <template><div><div class"well" ref"output"></div></div> </template><script>import { getExtend, readBuffer, render } from ./util;/*** 支持嵌入式显示&#xff0c;基于postMes…

谢希仁计算机网络第八版期末复习简答(2)

网络层 路由转发分组&#xff08;简答&#xff09;※ 一个网络中的主机A向另一个网络中的主机B发送数据&#xff0c;首先A将数据包发送给自己的默认网关路由器。路由器收到数据包之后&#xff0c;查看数据包头部&#xff0c;解析目的IP地址依次查询路由表&#xff0c;根据最长…

基于Deap遗传算法在全量可转债上做因子挖掘(附python代码及全量因子数据)

原创文章第604篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 在4.x的时候&#xff0c;咱们分享过deap遗传算法挖掘因子的代码和数据&#xff0c;今天我们来升级到5.x中。 源码发布Quantlab4.2&#xff0c;Deap因子挖掘|gplearn做不到的咱们也…

AI为什么无法替代律师?

AI能否真正取代律师&#xff1f;一探究竟&#xff01; ©作者|LuMiQ 来源|神州问学 引言 数字化时代&#xff0c;AI技术正如催化剂般加速各行业的变革&#xff1a;在医疗界&#xff0c;它犹如医生的“第二双眼睛”&#xff0c;精准分析影像&#xff1b;制造业里&#xff…

【C语言】深入浅出:C语言链表的全面解析

目录 一、单链表1. 基本概念节点结构定义 2. 创建链表示例代码输出结果 3. 插入节点示例代码输出结果 4. 删除节点示例代码输出结果 二、双向链表1. 基本概念节点结构定义 2. 创建双向链表示例代码输出结果 3. 插入节点示例代码输出结果 4. 删除节点示例代码输出结果 三、循环链…

名师引路,育梦成光 | 云校名师张梁老师收到学员诚挚感谢信!

在这个蝉鸣悠长的夏日里&#xff0c;一封满载感恩之情的信笺&#xff0c;悄悄诉说着一段珍贵的师生情谊。近日&#xff0c;深圳云校又一届“HCIE精英班”圆满结课&#xff0c;临别之际&#xff0c;姜同学以笔为媒&#xff0c;向我们展示了一位不仅传授知识&#xff0c;更以人格…

在kdevelop中运行程序并调试

补充前序知识&#xff1a; 1.CMakeLists.txt文件中&#xff0c;如下图&#xff0c;第一行生成的是静态库文件&#xff08;我们前一讲所使用的&#xff09;&#xff0c;第二行是动态库文件。 静态库与动态库&#xff1a; 静态库&#xff08;Static Libraries&#xff09; 定义…

torch.minimum与torch.min()

目录 1. torch.minimum 2. torch.minimum可以进行一个数组与多维度的比较 3.torch.min() 4. torch.min()多维度比较 1. torch.minimum torch.minimum() 函数用于逐元素地比较两个张量&#xff0c;并返回一个新的张量&#xff0c;其中每个元素是两个输入张量对应元素中的最小…

pychar安装、pychon安装、pycharm超过试用期30激活

如果pycharm超过试用期&#xff0c;可以双击vbs脚本重新激活 百度网盘&#xff1a; 链接: https://pan.baidu.com/s/1B-XyLOy3wjVWbJwuvZOHOw?pwdmsb6 提取码: msb6