express
一.1.每个文件都需要用到的配置项
安装express 框架和导入以及使用
npm i express
安装nodemon可以实施检测数据的变化自动重启服务器以前 (node 文件名)
(nodemon 文件名)
// 创建node服务器
// 导入express
const express = require('express')
// 创建web服务器,把express放在app实例上
const app = express()
//注册全局
app.use()
//使用app.listen方法启动服务器,listen是最后
app.listen(80,()=>{
console.log('服务器启动成功');
})
2.例子以及开始编写express基本用法
// 导入express
const express = require('express')
// 创建web服务器
const app = express()
// 监听客户端get和post请求,并向客户端响应具体的内容
app.get('/users',(req,res)=>{
// 调用express服务器,内置函数res.send()
res.send({name:'张三',age: 12,gender:'男'})
console.log("失败");
})
app.post('/user',(req,res)=>{
res.send("请求成功")
console.log("成功");
})
app.get('/',(req,res)=>{
// 通过req.query可以获取到客户端发送过来的查询参数,通常情况下是空对象{}
res.send(req.query)
// console.log("失败");
})
//:后面的参数可以自己定义传参,可以传入多个动态参数,而且是有个必须传入几个
app.get('/user/:id/:name',(req,res)=>{
// req.params是匹配动态到URL地址,默认也是一个空对象
res.send(req.params)
// console.log("失败");
})
app.listen(80,()=>{
console.log('服务器启动成功');
})
3.使用express.static方法链接静态资源
static里是文件静态资源,如果你的文件(我的是dist)里有多个静态页面,以index.html为主。
static也是express内置模块(我暂且叫他内置模块)
const express = require("express");
const app = express()
//app.use(express.static("./dist"))
// 挂在路径前缀
app.use('/abc',express.static("./dist"))
app.listen(80,()=>{
console.log("自己的主机ip,例如http://192.168.3.115");
})
4.定义中间件
这里主要说一下中间件里面next()函数,如果你不配置next将不会往下传递(不往下运行)
中间件说白了就跟vue里面的请求拦截器一个道理
const express = require('express')
const app = express()
// 中间件
const vm = function(req,res,next) {
// console.log("最简单的中间件");
// 添加时的中间件
const tiems = Date.now()
// req后面跟着一个自定义的属性
req.statrtiem = tiems
next()
}
// 将vm注册为全局生效的中间件
app.use(vm)
app.get('/',(req,res)=>{
// console.log("你好阿三打撒会计分录");
res.send("你好阿三打撒会计分录" + req.statrtiem)
})
app.get('/user',(req,res)=>{
// console.log("你好阿三打撒会计分录");
res.send("是否调用中间件" + req.statrtiem)
})
app.listen(80,()=>{
console.log("http://192.168.3.115");
})
5.局部生效中间件
const express = require('express')
const app = express()
const mw1=function (req,res,next) {
console.log("sadadas");
next()
}
app.get('/',mw1,(req,res)=>{
res.send("Home Page")
})
app.get('/user',(req,res)=>{
res.send("Home Pages")
})
app.listen(80,(req,res,next)=>{
console.log("http://192.168.3.115");
})
6.内置中间件express.json(),app.use(express.urlencoded({ extended: false }))和第三方中间件body-prser
const express = require('express')
const app = express()
// 配置json中间件
app.use(express.json())
// 通过express.urlencoded来解析url里的enced-url的数据
app.use(express.urlencoded({ extended: false }))
// 第三方express中间件
// const parser = require('body-prser')
// app.use(parser.urlencoded({ extended: false }))
app.get('/', (req, res) => {
// req.body可以接收客户端发送的请求体
console.log(req.body); //默认情况下没有配置表单中间件,则undefined
res.send("你好阿三打撒会计分录")
})
app.post('/user', (req, res) => {
console.log(req.body);
res.send("你好阿三打撒会计分录")
})
app.listen(80, () => {
console.log("http://192.168.3.115");
})
7.自定义中间件,模块化中间件
这个是父.js
const express = require('express')
const app = express()
// 导入node内置模块
const sns = require('./封装内置组件')
app.use(sns)
app.post('/user', (req, res) => {
// console.log(req.body);
res.send(req.body)
})
app.listen(80, () => {
console.log("http://192.168.3.115");
})
子.js
const qs = require('querystring')
const ssr = (req,res,next)=>{
let str =''
req.on('data',(chunk)=>{
str += chunk
})
req.on('end',()=>{
const body = qs.parse(str)
req.body = body
console.log(body);
next()
})
}
module.exports = ssr
8.定义错误的中间件
const express = require('express')
const app = express()
app.get('/',(req,res)=>{
throw new Error("服务器发生了错误 ")
res.send("Home Page")
})
// 定义错误的中间件,捕获整个项目的异常,这个中间件必须在所有路由之后,不然不会捕获
app.use((err,req,res,next)=>{
res.send(err.message)
next()
})
app.listen(80,()=>{
console.log("http://192.168.3.115");
})
9.接口模块化
父.js
// 最简单的路由用法
const express = require('express')
const app = express()
// 挂在路由,基本用法
// app.get("/",(req,res)=>{
// res.send("你好get")
// })
// app.post("/",(req,res)=>{
// res.send("你好post")
// })
const router = require('./routerModule.js')
// 路由模块前面加前缀
app.use('/api',router)
app.listen(80,()=>{
console.log("http://192.168.3.115");
})
子.js
const express = require('express')
const app = express()
// 路由模块化,创建路由对象
const router = express.Router()
// 挂载具体路由
router.get('/user/lsit',(req,res)=>{
res.send("这是list接口")
})
router.post('/user/add',(req,res)=>{
res.send("这是add添加 接口")
})
module.exports = router
补充:定义接口的时候data数据接收get请求用req.query,而post用req.body,如果post你访问成功了,但是在postman接口查看参数没有,需要配置app.use(express.urlencoded({ extended: false }))。
失败示例(但也请求成功,但是服务器响应不到你的数据):
在postman里面出现这种情况就需要配置express.urlencoded来解析url里的enced-url的数据
{
status:0,
msg:"数据请求成功",
}
成功示例(如果没有数据会返回空数组):
{
status:0,
msg:"数据请求成功",
data:{}
}
好了就总结到这里,小手冰凉的我要继续学习node.js,继续卷(dog)!!!