express
1.1、安装
npm init -y
npm i -S express
npm i -D nodemon //执行node程序,并实时监听文件变化,文件有变化时,无需重启,它会自动重启
1.2、创建web服务
const express = require('express')
// 创建web服务
const app = express()
// 监听 get请求
// req 请求对象
// res 响应对象
app.get('请求URI',(req,res)=>{
// 向客户端响应数据
res.send({id:1,name:'张三'})
})
// 监听POST请求
app.post('请求URI',(req,res)=>{})
put/delete/use 等
app.use() 模糊接受所有的请求
// 启动服务
app.listen(8080,()=>{})
//获取URL中的查询参数 ,通过 req.query 对象
app.get('/',(req,res)=>{
console.log(req.query)
})
//获取URL中的动态参数,通过通过 req.params 对象
app.get('/:id',(req,res)=>{
console.log(req.params)
})
1.3、静态资源管理
// 引入express模块
const express = require('express')
// 执行express函数,得到服务对象
const app = express()
// 开启服务器并绑定对应的主机和端口
app.listen(3000, '0.0.0.0', () => {
console.log('服务器启动');
})
// 静态资源服务器 可以设置多个
app.use(express.static('www'))
app.use(express.static('web'))
// 访问的前缀 在uri开头以 /admin开始则进行静态管理
app.use('/admin', express.static('admin'))
/* app.use(express.static('www', {
etag: false
})) */
1.4、路由
路由基本信息
// 引入express模块
const express = require('express')
// 执行express函数,得到服务对象
const app = express()
// 开启服务器并绑定对应的主机和端口
app.listen(3000, '0.0.0.0', () => {
console.log('服务器启动');
})
// 定义路由
// express对象.http请求动作(pathname,处理回函数)
// get请求 获取 200
app.get('/user', (req, res) => {
// 响应
res.send('user')
})
// post请求 添加 201
app.post('/user', (req, res) => {
let postData = ''
req.on('data', chunk => postData += chunk)
req.on('end', () => {
res.send(postData)
})
})
// 修改 完全修改(put)和增量修改(patch) 201/202
app.put('/user', (req, res) => {
res.send('put')
})
// 删除 delete http状态码 204 => 没有响应体
app.delete('/user', (req, res) => {
res.send('delete')
})
1.4.1、路由模块化
入口文件
// 引入express模块
const express = require('express')
// 执行express函数,得到服务对象
const app = express()
// 开启服务器并绑定对应的主机和端口
app.listen(3000, '0.0.0.0', () => {
console.log('服务器启动');
})
// 定义路由
// 匹配规则: 从文件上向下匹配,一旦匹配成功则不向下执行(默认)
// 书写规则: 精确写上面,模糊写在下面
// 获取所有的http请求动作 精确匹配 /user
/* app.all('/user', (req, res) => {
res.send(req.method)
}) */
// 精确
app.get('/user/100', (req, res) => {
res.send('user/100')
})
// 动态路由参数 如果动态路由参数中 ? 可选参数 可传可不传
/* app.get('/user/:id', (req, res) => {
res.send('user/200')
}) */
app.get('/user/:id/:name?', (req, res) => {
res.send(req.params)
})
// 通配符 * 所有 可以用它来做 404页面
/* app.all('*', (req, res) => {
res.status(404).send('404页面')
}) */
// 获取所有的http请求动作 模糊匹配 /user /user/a /user/b /user/...
// 请求以/user开头的路由
/* app.use('/user', (req, res) => {
res.send(req.method)
})
*/
// 所有的请求
app.use((req, res) => {
res.status(404).send('404页面!!')
})
控制器文件,control
// 用户控制器
// 数据
const users = require('../models/userModel')
module.exports = {
// 用户列表
index(req, res) {
res.send({
code: 0,
msg: 'ok',
data: users
})
},
// 查看当前id用户信息
show(req, res) {
let ret = users.find(item => item.id == req.params.id)
if (ret) {
res.send({
code: 0,
msg: 'ok',
data: ret
})
} else {
res.send({
code: 1000,
msg: 'ok',
data: null
})
}
},
store(req,res){
// 在此处写md5加密 专门加密 -》 交给下一个 req或res用自定义属性 req.pass = md5(admin) next()
// 添加用户 -> 向数据库写数据 -> req.userinfo = {} next()
// 给用户响应 res.send(req.userinfo)
}
models数据文件
// 用户数据 mysql mongodb ...
module.exports = [
{ id: 1, name: '张三', pass: 'aa' },
{ id: 2, name: '李四', pass: 'bb' },
];
1.5、中间件
中间件分为:
内置中间件 也就是express本身自带无带npm安装
第三方中间件
1.5.1、自定义中间件和内置和第三方
//自定义中间件
function mfn(req,res,next){
// 中间件最后一定要执行此函数,否则程序无法向下执行下去
next()
}
//内置中间件
app.use(express.static('托管目录地址'))
//==============================================
npm i -S body-parser
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.listen(3000)
// 关联
// querystring / qs
// application/x-www-form-urlencoded
/* app.use(bodyParser.urlencoded({ extended: false }))
// application/json
app.use(bodyParser.json()) */
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
app.post('/login', (req, res) => {
res.send(req.body)
})
1.6、cookie
cookie: 服务器端向客户端发送cookie并指定cookie的过期时间。 浏览器将cookie保存起来。之后每次请求都会将cookie发向服务器端,在cookie没有过期时间内服务器都可以得到cookie中的值。
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
// 中间件引入
app.use(cookieParser());
app.get('/', (req, res) => {
// 服务器端通过req来获取cookie数据
if (req.cookies.username) {
console.log(req.cookies);
res.send('再次欢迎你');
} else {
// cookie设置过期时间为1天
// maxAge 设置cookie过期时间 毫秒
res.cookie('username', 'admin', {maxAge: 86400*1000});
res.send('欢迎你~');
}
});
app.listen(3000)
1.7、session
session中的数据保留在服务端的。session的原理是通过一个sessionid来进行的,sessionid是放在客户端的cookie中,当请求到来时候,服务端会检查cookie中保存的sessionid是否有,并且与服务端的session数据映射起来,进行数据的保存和修改,也就是说当我们浏览一个网页时候,服务端会随机生成一个1024比特长的字符串,然后存在cookie中的sessionid字段中,当我们下次访问时,cookie会带有sessionid这个字段。
const express = require('express');
const session = require('cookie-session');
const app = express();
app.use(session({
name: 'sessionId',
// 给sessionid加密的key,随便填写s
secret: 'afsfwefwlfjewlfewfef',
//maxAge: 20 * 60 * 1000 // 20分钟
}));
app.get('/, (req, res) => {
if(!req.session['view']){
req.session['view'] = 1;
}else{
req.session['view']++;
}
res.send(`欢迎您第 ${req.session['view']} 次访问!`);
})
app.listen(3000)