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

最近在用基于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博客

Node.js是一个建立在谷歌V8引擎的运行环境,用于解析和执行JavaScript代码。它使得JavaScript不再局限于浏览器环境,可以在后端创建动态数据。\[1\]严格来说,Node.js不是一个框架,而是一个平台。它的技术栈包括核心模块、框架(如Express、KOA)、模板引擎(如Pug、EJS)、编译型CSS(如Lass/Sass/Stylus)和数据库(如MongoDB、MySQL)等。\[2\] Node.js基础知识包括了如何执行另一个模块中的功能。例如,在一个模块中使用require函数引入另一个模块,然后可以调用该模块中的功能。例如,如果有一个b.js模块和一个first.js模块,可以在first.js模块中使用require('./b')来引入b.js模块,并调用其中的功能。执行node first.js即可运行该程序。\[3\] #### 引用[.reference_title] - *1* [【入门级基础】Node基础知识总结](https://blog.csdn.net/pakerder/article/details/125191636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [node.js基础知识](https://blog.csdn.net/weixin_45459904/article/details/107508639)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值