1.解析数据
常见的数据格式有5种
- get 请求params
客户端传给数据的时候,直接利用 /home/id 的形式,比如请求产品信息 /user/32
// 直接利用req.params 来进行获取 (注意path的冒号后面的是key值)
app.get('/home/:id',(req, res, next) => {
console.log(req.params) // 获取到数据 {id: 32}
})
- get 请求query
客户端传给数据的时候,直接利用 /home?name=zhangsan&age=18 的形式
// 直接利用req.query 来进行获取 (注意path的冒号后面的是key值)
app.get('/home',(req, res, next) => {
console.log(req.query) // 获取到数据 {name: zhangsan, age: 18}
})
- post 请求json
利用了application/json 请求头,传一个json格式
// 利用express自己封装好的
app.use(express.json())
- post 请求urlEncoded
利用了application/x-www-form-urlencoded
// 利用 express 已有的
app.use(express.urlencoded({extended: true}))
- post 请求formData
利用第三方库 multer 来解析formData数据格式
const express = require('express')
const multer = require('multer')
const app = express();
// 使用multer解析formdata, 但是不能写成全局中间件,所有写成下面连续中间件的方法
// app.use(upload.any());
// 用来自定义上传的文件名称或者路径
const storage = multer.diskStorage({
destination: (req,file,cb) => {
cb(null, './uploads/')
},
filename: (req,file,cb) => {
cb(null, Date.now() + path.extname(file.originalname))
},
})
// 如果上传的是文件,解析文件
const upload = multer({
// dest: './uploads/' //目标地址,如果没有自动创建
// storage 如果想要自定义路径后缀名名称之类的,需要用storage,先const 一个
storage,
})
app.post('/login', app.use(upload.any()), (req,res, next) => {
console.log(req.body)
res.end('登录成功')
})
// 连续注册中间件 file为上传时候的key值,single只能上传一个文件, fields([{name: "file", maxCount: 2}])
app.post('/upload',upload.single('file'), (req,res, next) => {
console.log(req.file);// single用file,fields用数组 文件里面的相关信息是一个数组
res.end('文件上传成功')
})
app.listen(8000, () => {
console.log('服务启动成功')
})
2.打印日志
利用第三方库来进行日志的打印,比如请求日志等
const express = require('express')
const path = require('path')
const fs = require('fs')
// 安装morgan 保存日志(例如请求日志)到文件夹
const morgan = require('morgan');
const { WriteStream } = require('fs');
const app = express();
// 写入日志到文件
const writerStream = fs.createWriteStream('./logs/access.log', { // 地址
flags: 'a+' // 代表每一次都是追加
})
// combined 代表打印的格式
app.use(morgan("combined", {stream: writerStream}))
app.listen(8000, () => {
console.log('服务启动成功')
})
3. 错误处理
如果给next中传了参数,就是属于错误处理
// 错误处理中间件 next(new Error('xxx))
app.use((err, req, res, next) => {
let status = 400;
let message = ''
switch(err.message) {
case xxx:
message = '用户不存在'
break;
default:
message = 'NOT Found'
}
res.status(status);
res.json({
errCode: status,
errMessage: message
})
})
4. 响应类型
app.get('/home', (req, res, next) => {
res.type('application/json')
res.end('商品详情数据')
res.end(JSON.stringify({name: '张三', age: 18}))
// 或者直接用res.json({name: '张三', age: 18}) 直接是json
res.status(204) // 返回状态码
})
5. 配置静态资源服务器
const express = require('express')
const app = express();
// build 是打包完成后的静态资源文件夹
app.use(express.static('./build'))
app.listen(8000, () => {
console.log('服务启动成功')
})