【Express】获取请求参数和响应参数

// 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

  1. 核心用途
    主要用于文件上传和混合数据提交,支持文本字段与二进制文件共存。每个字段用 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

  1. 默认表单提交方式
    数据编码为键值对(key1=value1&key2=value2),非 ASCII 字符需 URL 编码。
    示例
    POST /login HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    username=john&password=123
    
    适用场景:简单文本数据提交(如登录表单),不涉及文件。

三、application/json

  1. 主流数据交换格式
    以 JSON 字符串传递结构化数据,支持嵌套对象和数组。
    示例
    {
      "name": "Alice",
      "age": 30,
      "hobbies": ["reading", "traveling"]
    }
    
    优势:可读性强,广泛用于 RESTful API 和现代前后端交互。

四、application/xml

  1. 传统结构化数据格式
    通过标签定义数据层次,适用于旧系统或 SOAP 协议。
    示例
    <user>
      <id>1</id>
      <name>Bob</name>
    </user>
    
    缺点:冗余度高,解析复杂度较 JSON 更高。

五、raw

  1. 自定义原始数据
    支持任意文本格式(如 JSON、XML、纯文本),需通过 Content-Type 明确类型。
    子类型
    text/plain:纯文本(无格式解析)。
    text/html:HTML 内容。

六、binary

  1. 二进制流传输
    直接发送文件二进制内容,适用于单文件上传。
    示例
    POST /upload HTTP/1.1
    Content-Type: image/png
    [二进制数据]
    
    注意:需手动指定 MIME 类型(如 image/jpeg)。

七、GraphQL

  1. 灵活查询语言
    通过单一端点动态获取所需数据,请求体包含查询语句和变量。
    示例
    query GetUser($id: ID!) {
      user(id: $id) {
        name
        email
      }
    }
    
    优势:避免多次请求,精准控制返回字段。

八、msgpack

  1. 高效二进制序列化
    数据体积比 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')  // 响应文件内容
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秀秀_heo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值