node-http模块 ==⇒ express框架 ==⇒ koa =⇒ egg.js
npm i express
express.static()
– 开放静态资源express.urlencoded()
– 获取POST请求体app.get()
– 处理客户端的GET请求app.post()
– 处理客户端的POST请求app.use()
– 设置应用级别的配置req.body
– 获取POST请求体req.params
– 获取GET请求动态参数req.query
– 获取GET请求参数(获取查询字符串参数)res.sendFile(文件的绝对路径)
– 读取文件,并将结果响应res.set({name, value})
– 设置响应头res.status(200)
– 设置响应状态码res.send(字符串或对象)
– 响应结果res.json(对象)
– 以JSON格式响应结果res.jsonp()
– 以JSONP格式响应结果请注意,在express中,我们仍然可以使用http模块中的方法。
符合以下条件的,为简单请求:
特点:发两次请求
会先发一次预检请求 OPTIONS
如果OPTIONS
中又允许跨域的头信息,浏览器会发第二次请求
// 1. 导入express模块
const express = require('express')
// 2. 创建服务器
const app = express()
// 3. 启动服务器
app.listen(3000, function () {
console.log('服务器启动成功')
})
// express 处理用户请求
// app.get() 用于处理用户的get请求
// app.post() 用于处理用户的post请求
app.get('/index',(req,res) => {
res.send('你好,新世界')
})
app.get('/login', (req,res) => {
res.send('哈哈
')
})
// 更多的是返回一个数据(express自动把这个对象转化为JSON )
app.get('/user', (req,res) => {
res.send({
name: 'zs',
age: 18,
gender: '女'
})
})
接口服务器:
根据用户的请求返回数据(JSON数据)
const express = require('express')
const app = express()
app.listen(3000, () => {
console.log('服务器启动成功了')
})
app.get('/login', (req, res) => {
// 允许该接口跨域访问 CROS
res.setHeader('Access-Control-Allow-Origin', '*') // *表示都可以跨域访问
res.send({
code: 200,
message: '成功'
})
})
什么是查询字符串?
使用req.query
获取查询字符串
const express = require('express')
const app = express()
app.listen(3000, () => {
console.log('服务器启动成功了')
})
app.get('/login', (req, res) => {
// 允许该接口跨域访问
res.setHeader('Access-Control-Allow-Origin', '*') // *表示都可以跨域访问
console.log(req.query)
const {username, password} = req.query
if(username === 'admin' && password === '123456') {
res.send({
code: 200,
message: '成功'
})
} else {
res.send({
code: 400,
message: '用户名或密码错误'
})
}
})
获取到的查询字符串:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<input type="text" placeholder="请输入用户名" class="username">
<br>
<input type="text" placeholder="请输入密 码" class="pwd">
<br>
<button>登录button>
<script src="node_modules/axios/dist/axios.js">script>
<script>
document.querySelector('button').onclick = async function () {
const username = document.querySelector('.username').value
const password = document.querySelector('.pwd').value
const res = await axios({
method: 'get',
url: 'http://localhost:3000/login',
params: {
username,
password
}
})
console.log(res)
}
script>
body>
html>
url/:id/:name/:age
:后面的就叫动态参数
使用req.params
获取动态参数
app.get('/getUser/:id', (req, res) => {
// 允许该接口跨域访问
res.setHeader('Access-Control-Allow-Origin', '*')
console.log(req.params)
res.send({
id: req.params.id,
name: 'zs',
age: 10
})
})
目前比较流行的是rest风格, 即简洁的接口风格
表现: id直接拼接到url中,也就是使用动态参数
注意:由于post请求的Content-Type
是application/json
, 所以它是一个复杂请求。
发送post请求步骤
app.options('*', (req, res) => {
// 允许CORS跨域的域名
res.setHeader('Access-Control-Allow-Origin', '*')
// 允许CORS跨域的请求方式,默认只有GET,POST
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE')
// 允许CORS跨域请求的请求头
res.setHeader('Access-Control-Allow-Headers', 'content-type')
res.send(null)
})
app.post('/login', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*')
res.send({
code: 200,
message: '登陆成功'
})
})
req.body
**express.json()
app.use(express.json())
...
...
app.post('/login', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*')
console.log(req.body)
res.send({
code: 200,
message: '登陆成功'
})
})
服务器端接收不同类型的请求体,使用的方式是不同的
app.use(express.urlencoded({extended: false}));
app.use(express.json());
– 没有演示multer
)中间件就是一个函数, 一般写在请求之前
有三个基本参数
const express = require('express')
const app = express()
// app.use(中间件) // 所有的请求之前都会调用中间件
const middle = function (req, res, next) {
console.log('我是中间件')
// 处理完一定要记得调用next
next()
}
app.use(middle)
app.listen(3000, () => {
console.log('服务器启动了')
})
app.get('/login', (req, res) => {
res.send('登录')
})
app.get('/user', (req, res) => {
res.send('用户')
})
app.get('/index', (req, res) => {
res.send('首页')
})
声明一个中间件AllowCrossDomain
const express = require('express')
const app = express()
// app.use(中间件) // 所有的请求之前都会调用中间件
const AllowCrossDomain = function (req, res, next) {
// 允许CORS跨域的域名
res.setHeader('Access-Control-Allow-Origin', '*')
// 允许CORS跨域的请求方式,默认只有GET,POST
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE')
// 允许CORS跨域请求的请求头
res.setHeader('Access-Control-Allow-Headers', 'content-type')
// 处理完一定要记得调用next
next()
}
app.use(AllowCrossDomain)
app.listen(3000, () => {
console.log('服务器启动了')
})
app.post('/login', (req, res) => {
res.send({
code: 200,
message: '登陆成功'
})
})
app.get('/user', (req, res) => {
res.send('用户')
})
app.get('/index', (req, res) => {
res.send('首页')
})
静态资源
// img是一个文件夹
// 直接把img作为公共的静态资源目录
app.use(express.static('img'))
application/x-www-form-urlencoded
application/json
一般 2, 3 同时使用
// 处理json数据
app.use(express.json())
// 处理form-urlencoded数据
app.use(express.urlencoded({extended: false}))