Express

233 阅读2分钟

1.解析数据

常见的数据格式有5种

  1. get 请求params

客户端传给数据的时候,直接利用 /home/id 的形式,比如请求产品信息 /user/32

// 直接利用req.params 来进行获取 (注意path的冒号后面的是key值)
app.get('/home/:id',(req, res, next) => {
  console.log(req.params) // 获取到数据 {id: 32}
})
  1. 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}
})
  1. post 请求json

利用了application/json 请求头,传一个json格式

// 利用express自己封装好的
app.use(express.json())
  1. post 请求urlEncoded

利用了application/x-www-form-urlencoded

// 利用 express 已有的
app.use(express.urlencoded({extended: true}))
  1. 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('服务启动成功')
})