1.默认安装最新版本的express

npm install express

2.创建一个基本的web服务器

//拿到express包
const express = require('express')
// 创建 web 服务器
const app = express()// 监听客户端的 GET 和 POST 请求,并向客户端响应具体的内容
app.get('/user', (req, res) => {res.send({ msg: '请求成功', name: 'req', gender: '男' })
})//都拿query
app.post('/user', (req, res) => {console.log(req.query)res.send({ name: '111', age: 20, gender: '男' })
})app.get('/', (req, res) => {// 通过 req.query 可以获取到客户端发送过来的查询参数console.log(req)console.log(req.query)res.send(req.query)
})// 这里的 :id 是一个动态的参数
app.get('/user/:ids/:username', (req, res) => {// req.params 是动态匹配到的 URL 参数,默认是一个空对象console.log(req.params)res.send(req.params)
})app.listen(8080, () => {console.log('express server running at http://localhost:8080')
})

3.静态托管资源

app.use(express.static('public'))
app.use(express.static('files'))
app.use('/bruce', express.static('bruce'))/*
可直接访问 public, files 目录下的静态资源
http://localhost:3000/images/bg.jpg
http://localhost:3000/css/style.css
http://localhost:3000/js/login.js通过带有 /bruce 前缀的地址访问 bruce 目录下的文件
http://localhost:8080/bruce/images/logo.png
*/
  • Express 在指定的静态目录中查找文件,并对外提供资源的访问路径,存放静态文件的目录名不会出现在 URL 中(比如访问,Public文件下的index.html,则开启服务器之后访问http:8080/index.html,外层的public就不写了 以public开始)
  • 访问静态资源时,会根据托管顺序查找文件
  • 可为静态资源访问路径添加前缀

4.使用NodeMon

能够监听文件变化,当代码修改后nodemon会自动重启项目,极大的方便了开发和调试

npm install -g nodemon

使用方法由node启动改为noemon启动

5.express路由

1.创建路由对象模块


const express = require('express')
// 创建路由对象
const router = express.Router()const app=express()
// 挂载具体路由
router.get('/user/list', (req, res) => {res.send('Get user list.')
})
router.post('/user/add', (req, res) => {res.send('Add new user.')
})// app.use('/api',router)// app.listen(8090,()=>{
//     console.log('http://localhost:8090')
// })// 向外导出路由对象
module.exports = router

2.注册路由模块

const express = require('express')
const router = require('./router')const app = express()// 注册路由模块,添加访问前缀
app.use('/api', router)app.listen(80, () => {console.log('http://127.0.0.1')
})

6.中间件

业务流程的中间处理环节

服务器收到请求之后可以通过中间件进行预处理

全局中间件

const express = require('express')
const app = express()// 定义第一个全局中间件
app.use((req, res, next) => {console.log('调用了第1个全局中间件')next()
})
// 定义第二个全局中间件
app.use((req, res, next) => {console.log('调用了第2个全局中间件')next()
})app.get('/user', (req, res) => {res.send('User page.')
})app.listen(8080, () => {console.log('http://localhost:8080')
})

局部中间件

const express = require('express')
const app = express()// 定义中间件函数
const mw1 = (req, res, next) => {console.log('调用了第一个局部生效的中间件')next()
}const mw2 = (req, res, next) => {console.log('调用了第二个局部生效的中间件')next()
}// 两种定义局部中间件的方式
app.get('/hello', mw2, mw1, (req, res) => res.send('hello page.'))
app.get('/about', [mw1, mw2], (req, res) => res.send('about page.'))app.get('/user', (req, res) => res.send('User page.'))app.listen(8080, ()=> {console.log('Express server running at http://localhost:8080')
})

注:

1.一定要在路由之前使用中间件

2.客服端发来请求可以调用多个中间件进行处理

3.执行完中间件要使用next()并且next()之后不能再有代码

4.多个中间件共享req和res

中间件的分类

1.应用级别中间件

通过 app.use() 或 app.get() 或 app.post() ,绑定到 app 实例上的中间件

2.路由级别中间件

绑定到 express.Router() 实例上的中间件,叫做路由级别的中间件。用法和应用级别中间件没有区别。应用级别中间件是绑定到 app 实例上,路由级别中间件绑定到 router 实例上。

const app = express()
const router = express.Router()router.use((req, res, next) =>{console.log(1)next()
})app.use('/', router)

3.错误级别的中间件

用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题

错误级别中间件的处理函数中,必须有 4 个形参,形参顺序从前到后分别是 (err, req, res, next) 。

错误级别的中间件必须注册在所有路由之后

const express = require('express')
const app = express()
//假装服务器发生了错误
app.get('/', (req, res) => {throw new Error('服务器内部发生了错误!')res.send('Home page.')
})// 定义错误级别的中间件,捕获整个项目的异常错误,从而防止程序的崩溃
app.use((err, req, res, next) => {console.log('发生了错误!' + err.message)res.send('Error:' + err.message)
})app.listen(8080, function () {console.log('Express server running at http://localhost:8080')
})

4.express内置中间件

express.static 快速托管静态资源的内置中间件,例如: HTML 文件、图片、CSS 样式等(无兼容性)

express.json 解析 JSON 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)

express.urlencoded 解析 URL-encoded 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)

如:

const express=require('express')
const app=express()app.use(express.json())app.post('/',(req,res)=>{console.log(req.body)res.send('hhh')
})
app.listen(8080,()=>{console.log('running at http://localhost:8080')
})

这里使用express.json让其能解析请求数据

5.第三方中间件

不是内置的,是第三方开发的如body-parser

npm install body-parser

const parser=require('body-parser')

app.use(parser)

6.自定义中间件

const bodyParser=(req,res,next)=>{//定义具体逻辑(解析表单数据)// 1.存储请求体数据2.监听data3.监听end事件4.用json.parse转回对象5.挂载req.body中给下游使用let str=''req.on('data',chunk=>{str+=chunk})req.on('end',()=>{const body=JSON.parse(str)req.body=bodyconsole.log(body)next()})
}
// 导出
module.exports=bodyParser
const express=require('express')const app=express()
// 1.导入自定义的中间件
const custom=require('./custom')
// 2.注册为可用中间件
app.use(custom)app.post('',(req,res)=>{
res.send(req.body)
})app.listen(8080,()=>{console.log('http://localhost:8080')
})

7.CORS跨域共享

1.中间件解决跨域

安装中间件 npm install cors

导入中间件 const cors=require('cors')

使用cors中间件 app.use(cors())

2.配置相应的响应头

  • CORS(Cross-Origin Resource Sharing,跨域资源共享)解决跨域,是通过 HTTP 响应头决定浏览器是否阻止前端 JS 代码跨域获取资源
  • 浏览器的同源安全策略默认会阻止网页“跨域”获取资源。但如果接口服务器配置了 CORS 相关的 HTTP 响应头,就可解除浏览器端的跨域访问限制
  • CORS 主要在服务器端进行配置。客户端浏览器无须做任何额外的配置,即可请求开启了 CORS 的接口。
  • CORS 在浏览器中有兼容性。只有支持 XMLHttpRequest Level2 的浏览器,才能正常访问开启了 CORS 的服务端接口(例如:IE10+、Chrome4+、FireFox3.5+)。

Allow-Origin:制定了允许访问资源的外域 URL

res.setHeader('Access-Control-Allow-Origin', 'http://bruceblog.io')
res.setHeader('Access-Control-Allow-Origin', '*')

Access-Control-Allow-Headers

  • 默认情况下,CORS 仅支持客户端向服务器发送如下的 9 个请求头:Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width 、Content-Type (值仅限于 text/plain、multipart/form-data、application/x-www-form-urlencoded 三者之一)
  • 如果客户端向服务器发送了额外的请求头信息,则需要在服务器端,通过 Access-Control-Allow-Headers 对额外的请求头进行声明,否则这次请求会失败!
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, X-Custom-Header')

Access-Control-Allow-Methods

  • 默认情况下,CORS 仅支持客户端发起 GET、POST、HEAD 请求。如果客户端希望通过 PUT、DELETE 等方式请求服务器的资源,则需要在服务器端,通过 Access-Control-Alow-Methods 来指明实际请求所允许使用的 HTTP 方法
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, DELETE, HEAD')
res.setHEader('Access-Control-Allow-Methods', '*')

8.请求分类

简单请求

  • 请求方式:GET、POST、HEAD 三者之一
  • HTTP 头部信息不超过以下几种字段:无自定义头部字段、Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width 、Content-Type(只有三个值 application/x-www-formurlencoded、multipart/form-data、text/plain)

#预检请求

  • 请求方式为 GET、POST、HEAD 之外的请求 Method 类型(如:DELETE,PUT)
  • 请求头中包含自定义头部字段
  • 向服务器发送了 application/json 格式的数据

在浏览器与服务器正式通信之前,浏览器会先发送 OPTION 请求进行预检,以获知服务器是否允许该实际请求,所以这一次的 OPTION 请求称为“预检请求”。服务器成功响应预检请求后,才会发送真正的请求,并且携带真实数据

express的学习相关推荐

  1. 开始nodejs+express的学习+实践(8)

    为什么80%的码农都做不了架构师?>>>    1.session使用 介绍的非常详细: http://www.cnblogs.com/chenchenluo/p/4197181.h ...

  2. Microsoft Visual C++2010 Express 2010学习版

    Microsoft Visual C++2010 Express是一款提供了强大而灵活的开发环境,主要于创建基于 Microsoft Windows 和 Microsoft .NET的应用程序. 该软 ...

  3. Express engine 学习笔记 - app.engine 的使用方法

    看下面这段代码: server.engine('html',ngExpressEngine({bootstrap: AppServerModule,})); app.engine(ext, callb ...

  4. Express engine 学习笔记 - 工作在反向代理背后的 Express 设置

    第22行的 express,返回的是一个 express Application 实例. 再看该实例的 set 方法: app.set(name, value) 将设置名称分配给值. 您可以存储您想要 ...

  5. Express初级学习

    1.Express安装: 首先我们要确认你是否安装了node windows下:命令行 node -V查看node版本(这里默认我们是安装好了的) 然后命令行输入 ` $ npm install -g ...

  6. PCI Express系统结构学习 - 第一章

    PCIe简介 PCI express是用来互联类似计算/通信平台应用中各个外设的第三代高性能I/O总线.第一代包括了:ISA.EISA.VESA和微通道(micro channel)总线:第二代总线包 ...

  7. PCI Express系统结构学习 - 第二章

    简介 TBD PCIe事务简介 PCIe是运用数据包进行设备间的数据传输的,根联合体可以和各个端点通信,一个端点也可以和另一个端点通信,通信涉及一种称之为处理层数据包(transaction laye ...

  8. express框架学习笔记

    express简介 express是一个基于Node.js平台的极简的.灵活的WEB应用开发框架.express是一个封装好的工具包,封装了很多功能,便于我们开发WEB应用(HTTP服务) expre ...

  9. Express框架学习记录一:Express框架基础使用

    Express框架 一.什么是Express框架 二.安装Express 三.框架的使用 1.监听get/post请求 2.获取 URL 中携带的查询参数 四.中间件 1.use中间件 2.中间件的作 ...

最新文章

  1. 四川2020年三月计算机等级考试报名时间,四川2020年3月计算机等级考试报名时间...
  2. Eclipse 里找不到 Servers 面板的原因和处理办法
  3. JAVA中数字格式异常,java - Java数字格式异常 - 堆栈内存溢出
  4. 3种团队分组适应项目_团队类型
  5. json转换成dart类 JSON to Dart
  6. ❤️Spring的声明式事务
  7. SpringCloud--Eureka 注册中心原理及其搭建
  8. Reflect Refract (以水渲染为例)
  9. AHOI2018训练日程(3.10~4.12)
  10. ts540服务器安装win7系统,解决本机不支持Win7系统安装问题[图文教程]
  11. Mesos-安装和使用
  12. Fisher discrimination criterion (费舍尔判别准则)
  13. 快递电子面单打印接口对接demo-JAVA
  14. 如何将已有图片做成透明水印_如何给图片制作透明水印
  15. SpringBoot整合微信扫码登录
  16. 一岁半女娃海中“游泳秀” 观众含泪观看
  17. 微机原理七种寻址方式
  18. LDPC码动态调度算法
  19. Linux常用命令——lvdisplay命令
  20. 如何打开Office 2007文档

热门文章

  1. 51NOD 1459 迷宫游戏
  2. 史上最全的WebRTC服务器技术选型分析
  3. 年薪超 50 W!揭秘 2022 年 AI 人才最想去的 3 家公司……
  4. 可视化工具Visdom的使用
  5. Markdown如何定义公式编号,以及引用编号
  6. Android | 音乐播放器 I(详解)
  7. 梅赛德斯奔驰最新!目标检测的结构化知识蒸馏
  8. 利用word2vec对关键词进行聚类
  9. mysql per sec_MySQL审计插件的测试(mcafee和mariadb版本)
  10. C语言丨折半查找(对分搜索)