// index.js
const express = require('express');
const app = express();
const router = express.Router();
router.get('/', (req, res) => {
// 获取数据 ?name='xxx'&age=18 -> { name: "'xxx'", age: '18' }
console.log(req.query)
// query 查询参数 params 路径参数
// 返回数据
res.send('get')
})
router.post('/', (req, res) => {
// 获取请求体x-www-form-urlencoded数据
// {"username":"xxx","password":123} -> [Object: null prototype] { username: 'xxx', password: '123' }
console.log(req.body)
res.send({ ok: 1 })
})
// 配置解析 post 参数的中间件 ?username='xxx'&password=123 形式
app.use(express.urlencoded({ extended: false }));
// json 形式
app.use(express.json());
app.use('/', router);
app.listen(3000, () => {
console.log('Example app listening on port 3000!');
});
1. 获取请求参数
app.get('/', (req, res) =>{
// 原生操作
console.log(req.method, req.url, req.headers, req.httpVersion)
// express 操作
console.log(req.path,req.query)
// 获取 ip
console.log(req.ip) // IP 地址可能是 ::1,这是 IPv6 的本地主机回环地址,等同于 IPv4 的 127.0.0.1
// 获取请求头
console.log(req.get('host')) // localhost:3000
// 结束响应前返回的最后一条数据
res.end('hello world')
})
1.1 获取请求体数据
const express = require('express');
const app = express();
var bodyParser = require('body-parser')
var urlencodedParser = bodyParser.urlencoded({ extended: false })
app.get('/login', (req, res) => {
// res.send('登录页面')
res.sendFile(__dirname + '/form.html')
})
app.post('/login', urlencodedParser, (req, res) => {
res.send('获取用户信息')
// res.send(req.body) // 报错:Cannot set headers after they are sent to the client
console.log(req.body)
})
app.listen(3000, () => {
console.log('服务器启动成功')
})
body-parse 包的具体用法:NPM
body-parser 包允许从请求主体中提取数据,这在您构建需要处理表单数据或其他类型的用户输入的 Web 应用程序时很有用。
body-parser 的 urlencoded 方法用于解析 URL 编码的表单数据。当你在网站上提交表单时,数据通常以 URL 编码格式的键值对形式发送,如下所示:
name=John+Doe&email=john%40example.com
bodyParser.urlencoded() 中间件函数将从请求主体中提取该数据,并将其作为 req.body 中的 JavaScript 对象提供。
bodyParser.urlencoded() 中的 { extended: false } 选项用于配置中间件,使其对 URL 编码数据使用经典编码算法。
- 设置为 false 时,URL 编码数据将使用 Node.js 内置的 querystring 库进行解析。
- 设置为 true 时,URL 编码数据将使用 qs 库进行解析,该库允许以 URL 编码格式对更复杂的数据结构进行编码。
常见的 HTTP 请求体格式:
一、multipart/form-data
- 核心用途
主要用于文件上传和混合数据提交,支持文本字段与二进制文件共存。每个字段用boundary
分隔符分割,确保数据完整性。
• 示例结构:
• 优势:支持多文件上传,兼容复杂表单场景。Content-Type: multipart/form-data; boundary=----WebKitFormBoundary ----WebKitFormBoundary Content-Disposition: form-data; name="username" admin ----WebKitFormBoundary Content-Disposition: form-data; name="file"; filename="image.png" Content-Type: image/png [二进制数据] ----WebKitFormBoundary--
二、application/x-www-form-urlencoded
- 默认表单提交方式
数据编码为键值对(key1=value1&key2=value2
),非 ASCII 字符需 URL 编码。
• 示例:
• 适用场景:简单文本数据提交(如登录表单),不涉及文件。POST /login HTTP/1.1 Content-Type: application/x-www-form-urlencoded username=john&password=123
三、application/json
- 主流数据交换格式
以 JSON 字符串传递结构化数据,支持嵌套对象和数组。
• 示例:
• 优势:可读性强,广泛用于 RESTful API 和现代前后端交互。{ "name": "Alice", "age": 30, "hobbies": ["reading", "traveling"] }
四、application/xml
- 传统结构化数据格式
通过标签定义数据层次,适用于旧系统或 SOAP 协议。
• 示例:
• 缺点:冗余度高,解析复杂度较 JSON 更高。<user> <id>1</id> <name>Bob</name> </user>
五、raw
- 自定义原始数据
支持任意文本格式(如 JSON、XML、纯文本),需通过Content-Type
明确类型。
• 子类型:
◦text/plain
:纯文本(无格式解析)。
◦text/html
:HTML 内容。
六、binary
- 二进制流传输
直接发送文件二进制内容,适用于单文件上传。
• 示例:
• 注意:需手动指定 MIME 类型(如POST /upload HTTP/1.1 Content-Type: image/png [二进制数据]
image/jpeg
)。
七、GraphQL
- 灵活查询语言
通过单一端点动态获取所需数据,请求体包含查询语句和变量。
• 示例:
• 优势:避免多次请求,精准控制返回字段。query GetUser($id: ID!) { user(id: $id) { name email } }
八、msgpack
- 高效二进制序列化
数据体积比 JSON 更小,解析速度更快,适合高性能场景。
• 安装与使用(PHP 示例):pecl install msgpack
• 适用场景:物联网、实时通信等高吞吐需求。$data = ["name" => "John", "age" => 30]; $packed = msgpack_pack($data); // 编码 $unpacked = msgpack_unpack($packed); // 解码
2. 获取响应参数
app.get('/', (req, res) => {
// 原生相应
res.statusCode = 404
res.statusMessage = 'Not Found'
res.setHeader('Content-Type', 'text/html')
res.write('<h1>Not Found</h1>')
res.end('<h1>Not Found</h1>')
// express 响应(可以链式调用)
res.status(404)
res.set('Content-Type', 'text/html')
res.send('<h1>Not Found</h1>')
res.redirect('/')
res.download('./data.json') // 响应下载(请求即自动下载)
res.json({
name: 'xx',
age: 19
}) // 响应 json,响应数据输出在页面上
res.sendFile('./data.json') // 响应文件内容
})