Express.js中基于user_id和id更新Post的REST API问题
解决Post更新接口的参数传递问题
你的需求是通过user_id和id两个条件更新post表,下面针对你尝试的两种路由方式给出正确实现:
一、使用路径参数(推荐RESTful风格)
你尝试的router.put('/post/:user_id/:id', updatePost);是标准的RESTful路径写法,控制器中通过req.params对象即可获取路径参数:
路由代码
router.put('/post/:user_id/:id', updatePost);
控制器代码
async updatePost(req, res) { try { // 从路径参数中取值,若数据库字段为数值类型,需转换为数字 const id = Number(req.params.id); const user_id = Number(req.params.user_id); const { title, content } = req.body; // 加入RETURNING *,让SQL返回更新后的行数据 const updatePost = await db.query( `UPDATE post SET title = $1, content = $2 WHERE id = $3 AND user_id = $4 RETURNING *`, [title, content, id, user_id] ); // 未匹配到目标行时返回404 if (updatePost.rows.length === 0) { return res.status(404).json({ error: 'Post不存在或无操作权限' }); } res.json(updatePost.rows[0]); } catch (err) { console.log('Error when update a post:', err); res.status(500).json({ error: '操作失败,请稍后重试' }); } }
请求示例:PUT /post/123/456(123为user_id,456为post的id),请求体携带title和content字段。
二、使用查询参数
若偏好查询参数的传递方式,路由无需占位符,前端通过?user_id=xxx&id=xxx传递参数即可:
路由代码
router.put('/post', updatePost);
控制器代码
async updatePost(req, res) { try { // 从查询参数中取值,注意类型转换 const id = Number(req.query.id); const user_id = Number(req.query.user_id); const { title, content } = req.body; const updatePost = await db.query( `UPDATE post SET title = $1, content = $2 WHERE id = $3 AND user_id = $4 RETURNING *`, [title, content, id, user_id] ); if (updatePost.rows.length === 0) { return res.status(404).json({ error: 'Post不存在或无操作权限' }); } res.json(updatePost.rows[0]); } catch (err) { console.log('Error when update a post:', err); res.status(500).json({ error: '操作失败,请稍后重试' }); } }
请求示例:PUT /post?user_id=123&id=456,请求体携带title和content字段。
你之前的错误点说明
- 最初的路由
/post/:user_id&id写法错误:路径参数必须用/分隔,&是URL查询参数的分隔符,不能混在路径参数中。 - 原控制器缺少
RETURNING *:PostgreSQL的UPDATE语句默认不返回更新后的行,导致updatePost.rows为空数组,加入该子句才能获取更新后的数据。
内容的提问来源于stack exchange,提问作者Kate
相关产品推荐
相关产品推荐

