如何从RTK向Node(MySQL连接)传参实现数据过滤?
解决RTK Query传参后返回全表数据的问题
你的核心问题是后端没有正确接收并使用前端传递的过滤参数,导致无论传什么都返回全表数据。下面分两种常见方案给出完整的修正代码:
方案1:使用URL查询参数(匹配你当前前端的写法)
后端修正代码
你原来的后端代码完全没用到前端传的user_id参数,需要从req.query中获取并加入SQL过滤:
app.get("/test", (req, res) => { // 从查询参数中提取user_id const { user_id } = req.query; // 有参数则过滤,无参数返回全表(可选逻辑,根据需求调整) const query = user_id ? 'SELECT * FROM portfolios WHERE user_id = ?' : 'SELECT * FROM portfolios'; // 参数化查询防止SQL注入,参数数组对应SQL中的?占位符 db.query(query, user_id ? [parseInt(user_id)] : [], (err, data) => { if (err) return res.json(err); return res.json(data); }); });
注意:
parseInt(user_id)是因为req.query中的值是字符串,若你的user_id是MySQL中的整数类型,需要转换类型避免匹配失败。
前端代码(无需修改)
你当前的RTK Query写法是正确的,params会自动拼接到URL成/test?user_id=6:
const testerApi = createApi({ reducerPath: 'tester', baseQuery: fetchBaseQuery({ baseUrl: "http://localhost:8800" }), endpoints(builder) { return { fetchTesting: builder.query({ query: (name) => { return { url: '/test', params: { user_id: name.id }, method: 'GET', }; }, }), }; }, });
方案2:使用URL路径参数(你尝试过但代码不完整)
如果你想改成/test/6这种路径传参的形式,需要同时修改前后端:
后端修正代码
// 定义带路径参数的路由 app.get("/test/:user_id", (req, res) => { // 从路径参数中提取user_id const { user_id } = req.params; const query = 'SELECT * FROM portfolios WHERE user_id = ?'; db.query(query, [parseInt(user_id)], (err, data) => { if (err) return res.json(err); return res.json(data); }); });
前端RTK Query修正代码
需要把参数拼接到URL路径中:
fetchTesting: builder.query({ query: (name) => { return { url: `/test/${name.id}`, // 把user_id拼到路径里 method: 'GET', }; }, }),
关键排查步骤
- 先单独测试后端接口:用浏览器/Postman直接访问
http://localhost:8800/test?user_id=6(或http://localhost:8800/test/6),确认返回的是过滤后的数据,排除后端逻辑问题。 - 检查参数类型:确保MySQL中
user_id的类型和你传递的参数类型一致(比如都是整数),避免类型不匹配导致过滤失效。 - 避免SQL注入:永远不要用字符串拼接的方式写SQL(比如
'SELECT * FROM portfolios WHERE user_id = ' + user_id),必须使用参数化查询。
内容的提问来源于stack exchange,提问作者Peter Double U
相关产品推荐
相关产品推荐

