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

使用Express和Knex实现CRUD路由时的ID校验问题

解决Express+Knex中PUT/DELETE接口不存在ID的错误处理问题

问题出在Knex的执行逻辑上:当执行update或del操作时,如果WHERE条件没匹配到任何数据,Knex不会抛出异常,自然不会进入catch块。它只会返回受影响的行数(del操作)或者空数组(update搭配returning时)。你之前的判断逻辑不对,所以没法拦截到ID不存在的情况。

下面是修正后的代码:

PUT 更新接口

// PUT update todo
router.put('/:id', (req, res) => {
    knex('todos')
        .where({ id: req.params.id })
        .update(req.body)
        .returning('*')
        .then(todos => {
            // 数组为空说明没有匹配到目标ID
            if (todos.length === 0) {
                return res.status(400).json({ error: '目标ID不存在' });
            }
            res.status(201).json(todos[0]);
        })
        .catch(error => {
            res.status(400).send(error);
        });
})

DELETE 删除接口

// DELETE 
router.delete('/:id', (req, res) => {
    knex('todos')
        .where({ id: req.params.id })
        .del()
        .then(deleteCount => {
            // 删除行数为0说明目标ID不存在
            if (deleteCount === 0) {
                return res.status(400).json({ error: '目标ID不存在' });
            }
            // 删除成功后返回所有待办项
            knex.select().from('todos')
                .then(todos => {
                    res.status(200).send(todos);
                })
                .catch(error => {
                    res.status(400).send(error.message);
                });
        })
        .catch(error => {
            res.status(400).send(error.message);
        })
})

关键说明

  • PUT接口:通过returning('*')返回的数组长度判断,空数组意味着没有匹配到对应ID,直接返回400错误。
  • DELETE接口:del()方法会返回实际删除的行数,行数为0时直接返回错误,无需执行后续的全量查询。

内容的提问来源于stack exchange,提问作者jSvSL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:02:45