Express 如何获取 GET 请求的 URL 参数?
Express 获取 GET 查询参数用 req.query(如 /search?q=node → req.query.q);路径参数用 req.params;表单 POST 体用 req.body。本文分清三者并给出完整示例。
查询字符串参数(?key=value)用 req.query;路由里的路径参数(/user/:id)用 req.params。
req.query:查询字符串
const express = require('express');
const app = express();
app.set("query parser", "simple");
// 访问 /example?param1=hello¶m2=world
app.get('/example', (req, res) => {
const param1 = req.query.param1; // 'hello'
const param2 = req.query.param2; // 'world'
res.json({ param1, param2 });
});
app.listen(3000);
不需要装任何东西,解析结果取决于 query parser;本例显式使用 simple。访问 /example?tag=a&tag=b 时 req.query.tag 是数组 ['a','b']。
req.params:路径参数
// 访问 /user/42
app.get('/user/:id', (req, res) => {
res.json({ userId: req.params.id }); // 42
});
三者别搞混
| 来源 | 例子 | 取值 |
|---|---|---|
| 查询字符串 | /search?q=node |
req.query.q |
| 路径参数 | /user/:id |
req.params.id |
| POST 表单体 | 表单提交 | req.body(需中间件) |
常见坑
- 不能假定所有 query 值都是字符串:重复键可成数组,扩展/自定义解析器还可能生成对象。数字参数先验证单一字符串、格式和范围,再 Number 转换并检查有限整数;
- 参数不存在是 undefined:给默认值
const page = req.query.page ?? 1; - 用户输入不可信:query 参数直接用进 SQL/命令前先校验(SQL 注入、命令注入)。
常见问题(FAQ)
Q:中文参数乱码?
Express 自动做 URL decode,正常不会乱码。出现乱码还需核查客户端编码、代理改写和自定义解析器,不能仅归因调用方。
Q:能拿到原始的查询字符串吗?
可以,req.originalUrl 含完整路径+查询串,自行用 new URL(req.originalUrl, 'http://x').searchParams 解析。
Q:同名参数想强制当数组处理?
本例 simple parser 对单值给字符串、多值给数组;其他解析器需先核对类型。统一处理:[].concat(req.query.tag ?? [])。