Express
Express 是最流行的 Node 框架,是许多其它流行 Node 框架 的底层库。它提供了以下的功能:
- 根据不同的url和不同请求方式返回不同的响应。
- 允许在请求管道的任何位置添加额外的中间件
- 集成了“视图”渲染引擎,以便通过将数据插入模板来生成响应。
- 设置常见 web 应用设置,比如用于连接的端口,以及渲染响应模板的位置。
Express简单使用教程
导入npm包
npm install express@4.17.1
简单的入门demo
使用express搭建服务器,测试get方法,向前端返回对象
//req 包含请求对象 res 包含响应对象
const express = require('express')
const app = express()
app.get('/user',(req,res)=>{
//发送json对象
res.send({name:"lin",age:20})
})
前置知识学习
进行测试之前,我们先来了解一下express响应函数的res,req两个参数,前面说req 包含请求对象 res 包含响应对象,用大白话来说,我们使用express传递数据时候,我们通过req获取前端传递的值,向后端传递的是res对象。
req包含两种属性,一种是req.body,一种是req.query。
req使用解析
req.body
req.body 属性包含在请求正文中提交的数据的键值对。默认情况下,它是未定义的,默认支持多种请求格式,使用前需要使用 body-parsing 的中间件进行解析,例如 express.urlencoded() 或 express.json()。
req.query
req.query 是一个请求对象,由 URL 中的请求查询字符串填充。这些查询字符串采用键值形式
req.params
req.params属性是一个包含映射到命名路由可实现动态携带参数的属性的对象。如请求的url地址为"/mo/:id",那么req.params指向的就是
res使用解析
res.send
res.send用于向前端发送对象,使用较多
res.json
基本的使用场景与res.send相同。不同之处在于,当传递对象或数组时,这两个方法是相同的,但是res.json()也会转换非对象,如null和undefined,这些无效的JSON。
res.end
用于收集前端数据,但并不提供数据,而是直接结束响应的下
res.download
实现前端向后端下载文件
res.redirect
实现页面重定向
get请求
//req 包含请求对象 res 包含响应对象
const express = require('express')
const app = express()
app.get('/user',(req,res)=>{
//发送json对象
res.send({name:"lin",age:20})
})
不支持多次响应数据
express只支持向前端返回一次数据,多次响应会出错:Cannot set headers after they are sent to the client
测试
测试get方法
app.get('/user',(req,res)=>{
res.send({name:"lin",age:20})
})
测试post方法
这里测试带参数的方法
app.post('/user',(req,res)=>{
console.log(req.query);
console.log(req.body)
res.send("请求成功")
})
测试页面重定向
//页面重定向
app.get('/redirect',(req,res)=>{
console.log("接收请求")
res.redirect('localhost:8080/user')
})
测试文件下载
app.get('/download',(req,res)=>{
console.log("接收请求")
console.log(req.query)
const paths = path.join(__dirname,"../",'/package.json')
res.download(paths,function (err){
if(err){
console.log(err)
}else{
console.log("下载完毕")
}
})
})
//动态携带参数
app.get('/mo/:id',(req,res)=>{
console.log("接收请求")
//req的parms是动态匹配的url的参数cd
console.log(req.params)
res.send(req.query)
})
完整的源码
const express = require('express')
const app = express()
const path = require('path')
app.use(express.urlencoded({extended:false}))
app.get('/user',(req,res)=>{
console.log(req.query);
console.log(req.body);
res.send({name:"lin",age:20})
})
//
app.post('/user',(req,res)=>{
console.log(req.query);
console.log(req.body)
res.send("请求成功")
})
//req 包含请求对象
//res 包含响应对象
app.get('/data',(req,res)=>{
console.log("接收请求")
console.log(req.query)
res.send(req.query)
})
//页面重定向
app.get('/redirect',(req,res)=>{
console.log("接收请求")
res.redirect('localhost:8080/user')
})
app.get('/download',(req,res)=>{
console.log("接收请求")
console.log(req.query)
const paths = path.join(__dirname,"../",'/package.json')
res.download(paths,function (err){
if(err){
console.log(err)
}else{
console.log("下载完毕")
}
})
})
//动态携带参数
app.get('/mo/:id',(req,res)=>{
console.log("接收请求")
//req的parms是动态匹配的url的参数cd
console.log(req.params)
res.send(req.query)
})
app.listen(8080,()=>{
}
)