如何在Redux与Express.js中正确实现带参数的GET请求?
解决Redux + Express GET请求传递日期参数的问题
你已经精准定位了报错原因:GET请求不能带请求体,并且已经把前端的参数改成了URL查询字符串,这步是对的!现在问题出在后端获取参数的方式错误,我来帮你一步步解决:
核心问题分析
你的前端代码已经把日期参数拼到了URL的查询部分(比如 custom-profit-report?param1=2024-01-01¶m2=2024-01-31),但后端还在尝试从 req.params 里拿值——req.params 是用来获取URL路径参数的(比如 /custom-profit-report/:startDate/:endDate 这种格式里的变量),而查询参数需要用 req.query 来获取。
具体修改步骤
1. (可选但更友好)优化前端参数命名
你当前用 param1 和 param2 作为参数键,改成和业务对应的 startDate、endDate 会让代码更易读,避免后续维护时混淆:
export const getCustomProfitReport = (startDate, endDate) => (dispatch) => { dispatch(customProfitReportLoading(true)) const bearer = 'Bearer ' + localStorage.getItem('token') // 改用语义化的参数名 let params = { startDate, endDate } let query = Object.keys(params) .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k])) .join('&') return fetch(baseUrl + 'custom-profit-report?' + query, { method: 'GET', headers: { 'Authorization': bearer } }) // 后续的响应处理代码保持不变 }
2. 必须修改:后端改用req.query获取参数
把后端获取日期的代码从 req.params 改成 req.query,同时可以加个简单的参数校验,避免空参数导致查询异常:
customProfitRouter.route('/') .options(cors.corsWithOptions, (req, res) => { res.sendStatus(200) }) .get(cors.cors, authenticate.verifyUser, authenticate.verifyAdmin, (req,res,next) => { // 从req.query中获取查询参数,对应前端的键名 let start = req.query.startDate let end = req.query.endDate // 可选:添加参数校验,确保请求携带了必要参数 if (!start || !end) { const error = new Error('请求必须包含startDate和endDate参数') error.status = 400 return next(error) } Sales.find({ "createdAt": { $gte: start, $lte: end } }) .populate('property') .populate('fee') .then((sales) => { res.statusCode = 200 res.setHeader('Content-Type', 'application/json') res.json(sales) }, (err) => next(err)) .catch((err) => next(err)) })
关于前后端是否需要同时修改?
- 如果你不想改前端的
param1/param2,后端只要改成req.query.param1和req.query.param2也能正常工作,但语义化的参数名更利于长期维护。 - 必须修改的只有后端的参数获取方式,这是解决当前问题的关键。
修改完成后,你可以先用Postman测试 GET /custom-profit-report?startDate=2024-01-01&endDate=2024-01-31 确认后端能返回正确数据,再测试Redux端的请求,应该就不会报错了。
内容的提问来源于stack exchange,提问作者arkanoid
相关产品推荐
相关产品推荐

