Express — 使用步骤

Express

Express

  • 介绍
  • 安装
  • 搭建服务器的步骤
  • express提供的新方法
  • GET接口
    • 获取GET中的请求参数
  • POST接口
    • 获取POST请求提交的数据
  • 中间件原理
  • 中间件语法
  • 中间件初体验(设置响应头)
  • 中间件开放静态资源
  • 中间件接收POST请求体
  • 中间件返回404页面

express 介绍

  • Express 是一个第三方模块,用于快速搭建服务器
  • Express 是一个基于 Node.js 平台,快速、开放、极简的 web 开发框架
  • express保留了http模块的基本API,使用express的时候,也能使用http的API
  • express还额外封装了一些新方法,能让我们更方便的搭建服务器
  • express提供了中间件功能,其他很多强大的第三方模块都是基于express开发的
  • Express 官网
  • Express 中文文档(非官方)
  • Express GitHub仓库

安装express

项目文件夹中,执行 npm i express。即可下载安装express。

注意:express不能安装在express文件夹中。否则安装失败。

使用Express构造Web服务器

使用Express构建Web服务器步骤:

  1. 加载 express 模块

  2. 创建 express 服务器

  3. 开启服务器

  4. 监听浏览器请求并进行处理

// 使用express 搭建web服务器
// 1) 加载 express 模块
const express = require('express');// 2) 创建 express 服务器
const app = express();// 3) 开启服务器
app.listen(3006, () => console.log('express服务器开始工作了'));// 4) 监听浏览器请求并进行处理app.get('GET请求的地址', 处理函数);app.post('POST请求的地址', 处理函数);

express封装的新方法

express之所以能够实现web服务器的搭建,是因为其内部对核心模块http进行了封装。

封装之后,express提供了非常方便好用的方法。

  • express

    • express.static() – 开放静态资源
    • express.urlencoded() – 获取POST请求体
    • 其他…
  • app

    • app.get() – 处理客户端的GET请求
    • app.post() – 处理客户端的POST请求
    • app.use() – 设置应用级别的中间件
    • 其他…
  • req

    • req.body – 获取POST请求体
    • req.params – 获取GET请求动态参数
    • req.query – 获取GET请求参数(获取查询字符串参数)
    • 其他…
  • res

    • res.sendFile(文件的绝对路径) – 读取文件,并将结果响应
    • res.set({name, value}) – 设置响应头
    • res.status(200) – 设置响应状态码
    • res.send(字符串或对象) – 响应结果
    • res.json(对象) – 以JSON格式响应结果
    • res.jsonp() – 以JSONP格式响应结果
    • 其他…

请注意,在express中,我们仍然可以使用http模块中的方法。

GET接口

// app.get('请求的URL', callback);
app.get('/api/getbooks', (req, res) => {// 处理GET方式的/api/getbooks接口
});app.get('/', (req, res) => {// 客户端没有指定请求的url,在这里处理。
});app.get('*', (req, res) => {// 处理所有的GET请求
})

app.get('*', (req, res) => {}) 他能够匹配到所有的GET请求,所以把它放到所有接口的最后。

获取GET方式请求的参数

获取url?参数=值&参数=值

  • 这种方式的参数,比较常规,参数部分也叫做查询字符串
  • 请求地址的写法: http://localhost:3006/test?id=3&bookname=zxx&age=20
  • 获取方式:req.query
// 写接口
app.get('/test', (req, res) => {console.log(req.query); // { id: '3', bookname: 'zxx', age: '20' }});

获取 url/:id/:name/:age

  • 这种方式的参数,叫做动态参数
  • 请求地址的写法:http://localhost:3006/test/3/zs/30
  • 要求请求的url参数必填,否则不能和定义的接口匹配
// 1个参数
// 浏览器的请求  http://localhost/test/3
// 测试接口,获取动态参数
app.get('/test/:id', (req, res) => {console.log(req.params); // 可以获取所有的动态参数 { id: 3 }res.send('收到参数');
});// 多个参数
// 浏览器的请求  http://localhost/test2/3/zhangsan/20
// 测试接口,获取多个动态参数
app.get('/test2/:id/:name/:age', (req, res) => {console.log(req.params); // 可以获取所有的动态参数  // { id: '4', name: 'zhangsan', age: '20' }res.send('全部收到');
});

POST接口

// app.post('请求的URL', callback);
app.post('/api/addbook', (req, res) => {// 处理POST方式的/api/addbook接口
});app.post('*', (req, res) => {// 处理所有的POST请求
})

获取POST请求体

  • GET方式没有请求体,POST方式才有请求体。

  • 请求体,即客户端提交的数据。

  • 我们仍然可以使用http模块中的语法,获取请求体。

  • POST请求体,有哪些格式

    • 查询字符串 – 对应的Content-Type: application/x-www-form-urlencoded
    • FormData对象 – 对应的Content-Type: multipart/form-data; --XXADFsdfssf

请求体是查询字符串


// 客户端,需要发送POST请求,提交的数据随便写// 写接口之前,配置
// 可以帮我们接收 content-type: application/x-www-form-urlencoded类型的请求体
app.use(express.urlencoded({extended: false}));// 后续,任何一个POST接口,都可以通过req.body获取到请求体的内容
app.post('/test', (req, res) => {// 获取请求体console.log(req.body);res.send('你的请求体收到了');
});

postman发送一个POST方式的请求,来配合测试:

在这里插入图片描述

获取FormData类型的请求体

比较麻烦,需要使用第三方模块(multer)才能够获取到。这里不做演示。

中间件介绍

  • 中间件(Middleware ),特指业务流程的中间处理环节。

  • 中间件,是express最大的特色,也是最重要的一个设计

  • 很多第三方模块,都可以当做express的中间件,配合express,开发更简单。

  • 一个express应用,是由各种各样的中间件组合完成的

  • 中间件,本质上就是一个 函数/方法

中间件原理

为了理解中间件,我们先来看一下我们现实生活中的自来水厂的净水流程。

在这里插入图片描述

  • 在上图中,自来水厂从获取水源到净化处理交给用户,中间经历了一系列的处理环节
  • 我们称其中的每一个处理环节就是一个中间件。
  • 这样做的目的既提高了生产效率也保证了可维护性。

express中间件原理:

在这里插入图片描述

中间件语法

  • 中间件就是一个函数

  • 中间件函数中有四个基本参数, err、req、res、next

    • 很多情况下,err都会省略
    • req就是请求相关的对象
    • res就是响应相关的对象
    • next:它是一个函数,某些时候,可以省略
  • 把写好的中间件函数,传递给 app.get()app.post()``或app.use()使用

示例代码:

// app.get('/api/getbooks',  中间件函数);
app.get('/api/getbooks', (req, res) => {})app.post('/api/add', 中间件函数, 中间件函数, 中间件函数, ......);// app.use([path],  中间件函数);
app.use((req, res, next) => {});app.use('/my', (req, res, next) => {});

中间件的特点

  • 每个中间件函数,共享req对象、共享res对象
    • js代码中,所有的req对象是一个对象;所有的res是一个对象
  • 不调用next(),则程序执行到当前中间件函数后,不再向后执行
    • 注意中间件的顺序,因为有可能因为顺序原因,你的中间件函数不会执行
    • 为了防止代码逻辑混乱,调用 next() 函数后不要再写额外的代码
  • 客户端发送过来的请求,可能连续调用多个中间件进行处理
  • 使用app.use()注册的中间件,GET和POST请求都可以触发

中间件初体验

为所有的请求,统一设置响应头

// 图书管理案例中,为所有的接口解决跨域问题
// 自定义中间件函数,统一处理跨域
app.use((req, res, next) => {// 为后续所有的接口设置响应头,解决跨域问题res.set({'Access-Control-Allow-Origin': '*'});next();
});

中间件详细使用方法

app.use的第一个参数

// 匹配url开头是 /my 的接口,比如 /my/aa  /my/bb ,但是不能匹配 /mynadsf
app.use('/my', (req, res, next) => {req.abc = '123';next();
});// 匹配url的开头是 /my 的接口,比如 /my/aa  /my/bb  /mysadfa   /myasdfdd
app.use('/my*', (req, res, next) => {.....
});

app.get 和 app.post使用多个中间件

//
// app.get('/abcd', ()=>{},  ()=>{},  ()=>{}, ....);app.get('/abcd', (req, res, next) => {req.abc = 'a';next();
}, (req, res, next) => {req.abc += 'b';next();
}, (req, res) => {res.send(req.abc);
});// app.get('/abcd', [()=>{},  ()=>{}, ....],  ()=>{});
let a = (req, res, next) => {req.abc = 'a';next();
};let b = (req, res, next) => {req.abc += 'b';next();
}app.get('/abcd', [a, b], (req, res) => {res.send(req.abc);
});

中间件的分类

  • 应用级别中间件
    • 针对整个项目进行配置的中间件,叫做应用级别的中间件
  • 路由级别中间件
    • 写到路由文件中的中间件(稍后介绍路由)
  • 错误处理中间件
    • 一般一个项目在最后,设置一个错误处理中间件即可。
    • 错误处理中间件,需要填4个参数(err, req, res, next)
  • 内置中间件
    • express自带的中间件
      • express.urlencoded()
      • express.static()
  • 第三方中间件
    • 别人写的模块,发布到npm上,我们下载下来,可以当做express的中间件
      • multer – 接收FormData数据的模块
      • cors - 解决跨域的

回顾获取请求体的方法

统一获取post请求体

app.use(express.urlencoded({extended: false}));
// app.use(方法);  --- 这是在配置中间件
// express.urlencoded()  --- 它是中间件函数,是express内置的中间件
// https://www.expressjs.com.cn/4x/api.html#express.urlencoded

express.urlencoded() 这也是一个函数,而且也是一个中间件函数。

它内部实现的原理是:

app.use((req, res, next) => {if (req.method === 'POST') {var str = '';req.on('data', chunk => {str += chunk;});req.on('end', () => {const querystring = require('querystring')req.body = querystring.parse(str);next();})} else {next();}
});

很多中间件,别人早已经写好了。我们直接使用即可。

我们后面还会做很多事情,比如开放静态资源、实现跨域资源共享(CORS)、身份认证、图片上传等等工作,别人早已经写好中间件了。我们后面学习这些中间件如何使用即可。

中间件开放静态资源

  • 什么叫做静态资源
    • css文件
    • 图片文件
    • js文件
    • 有时候也包括html文件
    • 等等
  • 什么叫做开放静态资源
    • 开放,即允许客户端来访问
  • 具体做法
    • 比如,允许客户端访问public文件夹里面的文件
    • app.use(express.static('public'))

在这里插入图片描述

中间件接收POST请求体

  • POST请求体的类型(Content-Type)

    • application/x-www-form-urlencoded 比如:id=1&name=zs&age=20
    • form-data 比如,提交的是FormData对象
    • application/json 比如,提交的是 {“id”: 1, “name”: “zs”, “age”: 20}
    • 其他…
  • 服务器端接收不同类型的请求体,使用的方式是不同的

    • urlencoded —> app.use(express.urlencoded({extended: false}));
    • application/json —> app.use(express.json()); – 没有演示
    • form-data —> 服务器端使用第三方模块处理(multer

当初学习ajax的时候,如果是POST请求,为什么要加Content-Type

使用第三方的中间件,实现跨域资源共享

昨天,我们自己写了中间件,实现了跨域资源共享(CORS)。但是是自己写的中间件。

实际上,实现跨域资源共享,可以使用一个叫做 cors 的第三方模块。推荐使用它来实现跨域资源共享。

使用方法:

  • 下载安装cors npm i cors
  • const cors = require('cors'); — 加载模块
  • app.use(cors()); – 注册中间件即可

中间件返回404页面

  • 服务器的代码,你的接口要写到前面
  • 当浏览器的请求到达服务器,优先使用你的接口
  • 如果请求的不是你的接口,则返回404页面
  • 所以,处理404要放到代码的最后。

在这里插入图片描述

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

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

相关文章

大模型工具_Langchain-Chatchat

https://github.com/chatchat-space/Langchain-Chatchat 原Langchain-ChatGLM 1 功能 整体功能,想解决什么问题 基于 Langchain 与 ChatGLM 等LLM模型,搭建一套针对中文场景与开源模型,界面友好、可离线运行的知识库问答解决方案。 当前解决…

iOS 键盘风格详解UIKeyboardType

一、键盘风格 UIKit框架支持8种风格键盘。 [java] view plaincopy print?typedef enum { UIKeyboardTypeDefault, // 默认键盘:支持所有字符 UIKeyboardTypeASCIICapable, // 支持ASCII的默认键盘 UIKeyboardTypeNu…

Node — 第四天(Promise与路由)

Promise - ES6新对象 Promise能够处理异步程序。 回调地狱 JS中或node中,都大量的使用了回调函数进行异步操作,而异步操作什么时候返回结果是不可控的,如果我们希望几个异步请求按照顺序来执行,那么就需要将这些异步操作嵌套起来…

winform datagridview控件使用

最近做项目时&#xff0c;显示查询结果总需要绑定到datagridview控件上显示&#xff0c;总结了给datagridview绑定数据的方式&#xff0c;以及导出datagridview数据到excel表格&#xff0c;如有错误请多指教 1.直接绑定数据源&#xff0c;可以绑定的数据格式有List<T>,Da…

Node — 第五天

1. MySQL数据库 phpstudy 数据库服务器及图形化软件 软件链接 链接&#xff1a;https://pan.baidu.com/s/1F8wdoMstHAJkINfDKDejsw 提取码&#xff1a;xl3k 数据库对于我们前端同学来说&#xff0c;就是一个了解。 对于不会变化的数据&#xff08;省、市、县&#xff09;&…

iOS10 权限访问崩溃

手机升级了 iOS10 Beta&#xff0c;然后用正在开发的项目 装了个ipa包&#xff0c;发现点击有关 权限访问 直接Crash了&#xff0c;并在控制台输出了一些信息&#xff1a; This app has crashed because it attempted to access privacy-sensitive data without a usage descr…

Node — 第六天(前后端分离)及(身份验证)

综合应用服务端知识点搭建项目 下载安装所需的第三方模块 npm init -y npm i express cors mysql # express 用于搭建服务器 # cors 用于解决跨域 # mysql 用于操作数据库# 后面用到什么&#xff0c;再下载创建app.js 之前&#xff0c;我们开启一个服务器&#xff0c;js文件…

继承上机作业

1、实现如下类之间的继承关系&#xff0c;并编写Music类来测试这些类 2、编写一个Java应用程序&#xff0c;该程序包括3个类&#xff1a;Monkey类、People类和主类E。要求&#xff1a; (1) Monkey类中有个构造方法&#xff1a;Monkey (String s)&#xff0c;并且有个public voi…

ApplePay集成教程

Apple Pay运行环境&#xff1a;iPhone6以上设备&#xff0c;操作系统最低iOS9.0以上&#xff0c;部分信息设置需要iOS9.2以上。目前还不支持企业证书添加。 环境搭建好后可以在模拟器上面运行&#xff0c;xcode7.2.1iPhone6SP9.2系统下&#xff0c;系统会绑定几种虚拟的银行卡…

Node — 第七天 (大事件项目接口实现一)

关于JS错误处理 node中和mysql中的错误处理 node和MySQL提供的方法&#xff0c;已经对错误信息进行了封装&#xff0c;只需要使用 err.message 即可获取到错误信息。 比如&#xff1a; const fs require(fs); // 读取一个不存在的文件 fs.readFile(abcd.txt, (err, data) …

1.Consul 简介和环境搭建

1.什么是 Consul Consul 是 service mesh(服务网格)的一个解决方案&#xff0c;它提供了诸如服务发现&#xff0c;配置和隔离等功能的一整套控制平面(control plane)。开发人员可以根据需要单独使用这些功能点&#xff0c;也可以将他们整合成为一个完整的service mesh。Consul …

Node — 第八天 (大事件项目接口实现二)

如何处理MySQL的错误 MySQL的错误信息&#xff0c;可以通过err来获取。这是没有问题的。 但是&#xff0c;我们加入了Promise&#xff0c;Promise中的错误&#xff0c;在外部是获取不到的&#xff0c;只能使用Promise相关方法来获取错误信息。 解决方法一 使用 JS原生的 tr…

在local模式下的spark程序打包到集群上运行

一、前期准备 前期的环境准备&#xff0c;在Linux系统下要有Hadoop系统&#xff0c;spark伪分布式或者分布式&#xff0c;具体的教程可以查阅我的这两篇博客&#xff1a; Hadoop2.0伪分布式平台环境搭建 Spark2.4.0伪分布式环境搭建 然后在spark伪分布式的环境下必须出现如下八…

APS系统对制造企业到底有多重要?看完这5点你就明白了

第一个问题&#xff1a;需要APS吗&#xff1f; APS是否重要&#xff0c;不能从其所体现的软件工具或系统角度来说&#xff0c;而应该从业务角度来说。对于制造工厂和车间的运行而言&#xff0c;计划是核心的业务。就如同那句俗话说的&#xff0c;没有规矩不成方圆&#xff0c;领…

Node — 第九天 (大事件项目接口实现三)

文章管理接口 设计数据表 添加文章接口 编写接口&#xff0c;使用postman模拟提交formdata类型的数据 在article.js 中&#xff0c;加入 /add 路由 postman模拟提交formdata类型的数据 multer处理文件上传 下载安装multer 加载模块 const multer require(multer) 配置上…

Node — 第九天 (ES6降级 and 发布属于自己的[第三方模块]包)

ES6降级处理 因为 ES 6 有浏览器兼容性问题&#xff0c;可以使用一些工具进行降级处理&#xff0c;例如&#xff1a;babel 降级处理 babel 的使用步骤 安装 Node.js命令行中安装 babel配置文件 .babelrc运行命令&#xff0c;完成降级 项目初始化 (项目文件夹不能有中文) npm …

Vue — 第一天(极速入门)

基本介绍 vue是什么 目标&#xff1a;了解vue的一些基础概念。 官方网站&#xff1a; https://cn.vuejs.org/ vue是&#xff1a;渐进式javascript框架。 两组概念 &#xff08;1&#xff09;框架 库。只提供一些API给开发者使用。jquery 是一个js库框架。拥有自己的规则和…

Vue — 第二天(v-model和过滤器)

VUE-02-v-model和过滤器 昨日反馈与回顾 代码仓库的问题 不要修改你克隆下来的仓库中任意代码&#xff0c;否则&#xff0c;下次pull时&#xff0c;可能会报错&#xff0c;从而得到不到最新的代码。 如果已经遇到了这个冲突&#xff1a; 解决冲突(git 中解决冲突)把关键代码…

牛人iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

概览 随着移动互联网的发展&#xff0c;如今的手机早已不是打电话、发短信那么简单了&#xff0c;播放音乐、视频、录音、拍照等都是很常用的功能。在iOS中对于多媒体的支持是非常强大的&#xff0c;无论是音视频播放、录制&#xff0c;还是对麦克风、摄像头的操作都提供了多套…

Vue — 第三天(计算属性和json-server)

计算属性 使用场景 如果一个结果需要依赖data中的数据&#xff0c;但是需要经过一些逻辑处理&#xff0c;才能得到你想要的数据。此时就可以使用计算属性。 例如&#xff1a;要对给定的字符串做翻转处理之后再来显示。 <div id"app"><!-- 此处逻辑复杂 …