Express框架

@Express
概述 overview
保留了node的原生功能
添加|增强了很多功能,如创建服务器
更多信息,请访问 Express.js
扩展 node-snippets
安装:在Vs Code扩展中搜索并安装
使用:
1. node-express:快速创建基于express的nodejs服务器
const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => res.send('Hello World!'))
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
2. node-express-get:创建get路由
app.get('/', (req, res) => {
  res.send('GET request to the homepage')
})      
3. node-express-get-params:创建动态get路由
app.get('/books/:bookId', (req, res) => {
  res.send(req.params.bookId)
})
4. node-express-post:创建post路由
app.post('/', function (req, res) {
  res.send('POST request to the homepage')
})      
5. node-express-post-params:创建动态post路由
app.get('/books/:bookId', (req, res) => {
  res.send(req.params.bookId)
})      
请求 req
属性
req.protocol

请求的协议 http 或 https

req.url

请求url地址

查询路由 query - 使用?拼接字符串;/detail?key=value&key=value&...
server.get('/detail', (req, res) => {
  res.send(req.query)
})      
动态路由 params - 拼接路径;/detail/:id
server.get('/detail/:id', (req, res) => {
  res.send(req.params)
})      
方法
get()

获取请求信息,如主机

req.get('host')
响应 res
属性
write() - 写回流时,需要显式指定结束 end()

argument: must be of type string or an instance of Buffer or Uint8Array

res.write(data)
res.end()
send() - 发送HTTP响应;支持多种格式
res.send('hi,there.') 
res.send('<h1>hi,there.</h1>') 
res.send({ id: 10, name: 'gl' }) 
sendFile() - 发送文件;需要指定参考路径

直接传输文件,不需要将文件从用户空间拷贝到内核空间,文件传输效率提高;减少内存拷贝,减少CPU消耗,提高系统性能

只能用于发送静态文件,不能传输其他类型的数据

只能传输2GB以下的文件

res.sendFile('./www/index.html', { root: __dirname })
json() - 返回json数据;更常见
res.json({
  "errno": 0,
  "data": {
    "url": 'http://127.0.0.1:3000/upload/' + req.file.filename,
  }
})      
render() - 渲染页面;页面路径依据配置的静态资源路径
res.render('home/index', {
  navIndex: 0
})
res.status()

设置 HTTP 响应的状态码。状态码是服务器返回给客户端的一个数字,用于表示请求的处理结果

成功的响应

res.status(200).json({ 'msg': 'ok' });
res.status(200).json({ 'code': 200, 'msg': 'Success', 'data': jsonData });

400 错误,并附带一个错误消息

res.status(400).json({ 'msg': 'Bad Request' });
res.status(400).json({ 'code': 400, 'msg': 'Invalid request parameters' });
方法
404
以中间件 use() 的形式实现
所有路由都匹配失败,则匹配 404;所以 404 中间件应该放在所有路由的 后面
注意路径的拼接
//其它路由

server.use((req, res) => {
  res.status(404).sendFile('./www//lost.html', { root: __dirname })
})
//其它路由

server.use((req, res) => {
  res.status(404).sendFile('lost.html', { root: __dirname + '/www/' })
})
中间件在 req 和res 之间执行;拿到 res 后就没有必要了
中间件 Middleware
express.urlencoded({ extended: true })
解析值对类型的数据,如表单提交的数据;表单默认的编码形式
extended 使用哪种库来解析请求体。true,使用qs库,允许解析更复杂的对象和数组;false,使用querystring库,能力较弱,不支持数组和对象的嵌套结构
请求成功后,在开发者工具 → 网络 Network → Fetch/XHR中选择请求,在 负载 Payload 中查看解析后的数据 Form Data
express.json()
解析json数据,无需手动解析:JSON.parse()