文章目录
Express框架
1、初体验express
javascript
// 导入express包
const express = require('express')
// 创建应用对象
const app = express()
// 创建路由
app.get('/home', (req, res) => {
res.end('hello express')
})
// 启动服务监听端口
app.listen(3000, ()=>{
console.log('服务启动成功。。。')
})
2、什么是路由
官方定义:路由确定了应用程序如何响应客户端对特定端点的请求
3、路由的使用
javascript
// 导入express包
const express = require('express')
// 创建应用对象
const app = express()
// 创建路由
app.get('/home', (req, res) => {
res.end('hello express')
})
// 创建路由
app.post('/login', (req, res) => {
res.end('login')
})
// 匹配全部
app.all('/all', (req, res) => {
res.end('all')
})
// 全都匹配不上就走这里
app.all('*', (req, res) => {
res.end('Not Found 404')
})
// 启动服务监听端口
app.listen(3000, ()=>{
console.log('服务启动成功。。。')
})
3、获取请求参数
javascript
const express = require('express')
// 创建应用对象
const app = express()
app.get('/request', (req, res) => {
// http模块方法
console.log('原生获取url ', req.url)
console.log('原生获取请求方式 ', req.method)
console.log('原生获取http版本号 ',req.httpVersion)
console.log('原生获取headers ',req.headers)
// express 封装的方法
console.log('express获取url ', req.path)
console.log('express获取请求参数 ',req.query);
// 获取ip地址
console.log('express获取ip地址 ', req.ip);
// 获取指定headers中的内容
console.log('express获取指定header',req.get('host'))
res.setHeader('content-type', 'text/html;charset=utf-8')
res.end('请求成功!')
})
app.listen(3000, () => {
console.log('服务启动成功,监听端口3000')
})
4、电商项目商品详情场景配置路由占位符规则
javascript
// 导入express模块
const express = require('express')
// 创建应用对象
const app = express()
// 创建路由
// :id占位符,所有这种格式的请求都会进入这里
app.get('/:id.html', (req, res) => {
// params上存储所有的请求参数,id就是路由中的id,字段名必须一致才能取出来
console.log(req.params.id)
res.setHeader('content-type', 'text/html;charset=utf-8')
res.end('商品详情')
})
// 启动服务
app.listen(3000, () => {
console.log('服务启动成功,监听端口3000')
})
5、小练习,根据id参数返回对应歌手信息
javascript
const express = require('express')
const app = express()
const singers = [
{
name: '周杰伦',
id: 1
},
{
name: '许嵩',
id: 2
},
{
name: '汪苏泷',
id: 3
}
]
// 根据id返回指定数据
app.get('/:id.html', (req, res) => {
const data = singers.filter(item => item.id == req.params.id)
console.log(data)
if (data.length == 0) {
res.statusCode = 404
res.end('<h1>404 Not Found</h1>')
return
}
res.setHeader('content-type', 'text/html;charset=utf-8')
res.end(JSON.stringify(data[0]))
})
app.listen(3000, () => {
console.log('服务启动成功')
})
6、express和原生http模块设置响应体的一些方法
javascript
const express = require('express')
const app = express()
app.get('/response', (req, res) => {
// 原生方法
// 修改状态码
res.statusCode = 404
res.statusMessage = 'abcd'
// 设置响应头
res.setHeader('111', '222')
// 设置响应体
res.write('hello express')
res.end('response')
// express 方法
res.status(500)
res.set('aaa','bbb')
res.send('你好 我是send') // 使用send会自动配置响应头Content-Type:text/html; charset=utf-8,中文不乱码
res.status(500).set('aaa','bbb').send('你好 我是send') // 可以链式调用
})
app.listen(3000, () => {
console.log('服务启动成功')
})
7、其他响应设置
javascript
const express = require('express')
const app = express()
app.get('/other', (req, res) => {
// 重定向
res.redirect('http://www.baidu.com')
// 下载
res.download(__dirname + '/index.js')
// JSON响应
res.json({
name:'你好'
})
// 响应文件内容
res.sendFile(__dirname + './text.html')
})
app.listen(3000, () => {
console.log('服务启动成功')
})
8、express中间件
8.1、什么是中间件
中间件本质是一个回调函数
中间件函数可以像路由回调一样访问请求对象(request),响应对象(response)
8.2、中间件的作用
中间件的作用就是使用函数封装公共操作,简化代码
8.3、中间件的类型
- 全局中间件
- 路由中间件
8.4、定义全局中间件
javascript
// 导入
const express = require('express')
const fs = require('fs')
const path = require('path')
const app = express()
// 声明中间件函数,共有三个参数,请求报文。响应报文。和next函数
// next()函数如果后续有代码执行,必须调用。
function recordMiddleware(req, res, next) {
// 获取url和IP地址
let { url, ip } = req
fs.appendFileSync(path.resolve(__dirname, './access.log'), `ip${ip}访问了${url}\r\n`)
next()
}
// 使用中间件函数
app.use(recordMiddleware)
app.get('/home', (req, res) => {
res.send('前台首页')
})
app.get('/admin', (req, res) => {
res.send('后台首页')
})
app.all('*', (req, res) => {
res.send('<h1>404 Not Found</h1>')
})
app.listen(3000, () => {
console.log('服务启动成功')
})
8.5、定义路由中间件
javascript
const express = require('express')
// 创建应用对象
const app = express()
// 定义全局路由中间价函数
const checkCodeMiddleware = (req, res, next) => {
let { code } = req.query
if (code != '521') {
res.send('暗号错误!')
return
}
next()
}
// 可以全局注册也可以局部使用,直接在路由中调用
app.get('/home', checkCodeMiddleware, (req, res) => {
res.send('前台页面')
})
app.get('/admin', (req, res) => {
res.send('后台页面')
})
app.listen(3000, () => {
console.log('服务启动成功...')
})
8.6、静态资源中间件
javascript
// 静态资源中间件设置, public就是静态资源目录。配置以后不管任何文件格式,这个方法都会给我们配置好mime类型。
app.use(express.static(__dirname + '/public'))
9、获取请求体数据
要使用到一个中间件body-parser
,这个中间件有两个方法
先安装中间件npm i body-parser
javascript
const bodyParser = require('body-parser')
// 解析JSON格式的请求体的中间件
const jsonParser = bodyParser.json()
// 解析 querystring 格式请求体的中间件
const urlencodedParser = bodyParser.urlencoded({extended:false})
app.post('/login', urlencodedParser, (req,res)=>{
// 调用这个中间件以后,会给req中添加一个body,就是请求参数
const {username} = req.body
res.send(username)
})
10、防盗链的实现
防盗链就是指一个网站的一些静态资源,通过判断请求头中的referer属性是否为本服务ip或者域名
,从而阻止一些外部系统访问资源
。
javascript
const express = require('express')
const app = express()
// 静态资源中间价设置
app.use(express.static(__dirname + '/public'))
// 防盗链的原理主要是判断请求头中的referer 是否为自己服务的地址
const staticMiddleware = (req, res, next) => {
// 检测请求头中的referer是否为 127.0.0.1
// 获取referer
let referer = req.get('referer')
if (referer) {
// 序列化referer
let url = new URL(referer)
let hostname = url.hostname
console.log(hostname)
if (hostname !== '127.0.0.1') {
// 响应404
res.status(404).send('<h1>404 Not Found</h1>')
}
}
next()
}
app.use(staticMiddleware)
app.get('/login', (req, res) => {
res.send('登录')
})
app.listen(3000, () => {
console.log('服务启动成功...')
})
11、路由的模块化
创建一个routers目录。创建homeRouters.js文件存放路由
javascript
const express = require('express')
// 创建路由对象
const router = express.Router()
router.get('/admin', (req, res) => {
res.send('后台管理')
})
// 暴露router
module.exports = router
主要文件引入routers里面的文件,使用app.use挂载到app上
javascript
const express = require('express')
const homeRouters = require('./routers/home.js')
const adminRouters = require('./routers/admin.js')
const app = express()
app.use(homeRouters)
app.use(adminRouters)
app.all('*', (req, res) => {
res.send('<h1>404 Not Found</h1>')
})
app.listen(3000, () => {
console.log('服务启动成功...')
})
全部文章
从0到1学习node.js(fs模块)
从0到1学习node.js(path模块以及HTTP协议)
从0到1学习node.js(http模块)
从0到1学习node.js(npm)