You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:27:16