【Node.js】笔记整理 5 - Express框架

写在最前:跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识,需要格外注重实战和官方技术文档,文档建议作为手册使用

系列文章

前言

Express框架是一个基于node.js的极简web应用开发框架,他可以作为一个简单的后端去使用,换而言之,前端可以使用express框架去写后端

Express框架官网

1、安装

npm i express

2、初始化express项目

npm init
npm i express

3、基本配置

// 导入express模块
const express = require('express')

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

// 创建后端路由
app.get('接口url', (req, res) => {
   
    // 对接口进行处理
    res.end(data)
})

// ...其他路由

// 开启监听,启动服务
app.listen(port, () => {
   
    // 服务启动成功的回调函数
})

4、路由

这个路由是后端的路由,和前端的路由有所不同,请注意

4.1、定义

路由确定了应用程序如何响应客户端对特定端点的请求,也就是说,路由是满足此条件的一种特殊映射

4.2、组成

路由的组成部分包括:请求方法method接口url回调函数callback(req, res)

express提供了以下方法可以方便地使用路由:app.<method>(path, 中间件 ,callback)

  • GET:app.get('接口url', (req, res) => {})
  • POST:app.post('接口url', (req, res) => {})
  • PUT: app.put('接口url', (req, res) => {})
  • DELETE:app.delete('接口url', (req, res) => {})

5、获取请求体参数

其实之前已经记过了

以此路由为例: app.post('/login', (req, res) => {})

api 功能
req.method 获取请求方法
req.url 获取请求接口
req.httpVersion 获取请求http版本
req.headers 提取请求头信息
req.query 获取请求体中的query参数
req.get(‘chosen_header’) 提取指定名称的请求头
req.path 获取请求的path
req.ip 获取客户端的ip地址
req.params 获取params参数

6、获取路由参数

req.queryreq.params

7、响应设置

首先,express是支持使用http模块设置响应设置的方法来设置响应设置的

express独有的设置相应设置的方法:

api 功能
res.status( code ) 设置响应状态码
res.set(‘xxx’, ‘yyy’) 设置响应头信息,比如设置token、Content-Type等
res.send( data ) 设置响应体
res.redirect( path ) 设置前端接收到响应体后页面重定向的path
res.download( file ) 设置下载相应
res.json( { name: ‘hello express’ } ) 设置响应JSON
res.sendFile(__dirname + ‘/filename.html’) 设置响应文件内容
res.send( data ) 将相应信息发送给前端,该方法默认设置字符集为utf-8

以上方法均支持链式调用

8、中间件

该节很重要,学习时候请结合组件思维

**定义:**本质是一个回调函数,中间件函数可以像路由回调一样访问requestresponse

作用:使用函数封装公共操作、简化代码。其实说白了就一件事:为了高内聚、低耦合

**类型:**全局中间件、路由中间件

8.1、全局中间件

全局中间件指的是每一个请求到达服务端后都会执行的函数。从这个角度来看,其实axios拦截器就像是一种全局中间件

声明:

const middleware_name = (req, res, next) => {
   
    // 对req、res进行统一处理
    
    // 该中间件的功能执行结束后,若需要执行路由中设置的回调函数,那么必须next()
    next()
}

// 全局使用:
app.use(middleware_name)

8.2、路由中间件

针对某些请求进行统一处理

声明中间件:

const check = (req, res, next) => {
   
    if(xxxx){
   
        // 满足条件则处理并执行所在路由的回调
        // ...
        next()
    }else{
   
        // ...
    }
}

使用中间件:

app.get('/admin', check, (req, res) => {
   
    // ...
    res.send(data)
})

8.3、静态资源中间件

语法:express.static('静态资源文件夹路径')

app.use( express.static(__dirname + '/public/assets') )

8.4、获取请求体数据

需要使用包:body-parser

安装

npm i body-parser

导包并获取中间件函数

const bodyParser = require('body-parser')

// 按需导出函数
// 处理querystring格式请求体
let urlParser = bodyParser.urlencoded({
    extended: false })
//处理JSON格式的请求体
let jsonParser = bodyParser.json()

设置路由中间件,并使用request.body获取请求体数据

app.post('接口url', urlParser, (req, res) => {
   
    let body = req.body
    // 对body进行处理
    
    res.send(xxx)
})

9、防盗链

防止外部网站盗取自己网站的源资源

实现:

app.use((req, res, next) => {
   
    // 检测请求头referer是否为自己的地址
     let referer = req.get('referer')
     if(referer){
   
         let url = new URL(referer)
         let hostname = url.hostname   
         if(hostname !== 'xxx'){
   
             // 不是自己地址则404
             res.status(404).send('xxxx')
             return
         }
     }
    next()
})

10、路由模块化

routes/user.js

const express = require('express')

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

// 创建路由规则
router.get('/login', (req, res) => {
   
    // ....
})
// ...

// 暴露router
module.exports = router

src/index.js

const express = require('express')
const app = express()
// 导入路由模块
const userRouter = require('../router/user')

// 使用路由
app.use(userRouter)

脚手架 - express-generator

npm install [options] express-generator

使用:

express myApp          # 初始化express项目结构
express install        # 安装依赖

在这里插入图片描述
如果你要使用express发送html页面,那么不必删除什么,如果只是做后端,要把views文件夹和发送html页面相关的代码都删干净

相关推荐

  1. Node顶级框架-----Express....

    2023-12-07 17:36:09       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 17:36:09       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 17:36:09       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 17:36:09       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 17:36:09       20 阅读

热门阅读

  1. 【重点】【双指针】42. 接雨水

    2023-12-07 17:36:09       41 阅读
  2. mybatis 实现批量更新的三种方式

    2023-12-07 17:36:09       28 阅读
  3. 【LVS实战】05 keepalived脑裂问题解决方案

    2023-12-07 17:36:09       28 阅读
  4. 再见了 shiro

    2023-12-07 17:36:09       36 阅读
  5. ARM Cortex-A、Cortex-M和Cortex-R简介

    2023-12-07 17:36:09       32 阅读
  6. 【ARM AMBA AXI 入门 18 - AXI4 NSAID 和 NS 详细介绍】

    2023-12-07 17:36:09       35 阅读
  7. [ffmpeg] find 编码器

    2023-12-07 17:36:09       37 阅读
  8. css3新增的伪类有哪些?

    2023-12-07 17:36:09       36 阅读