使用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
相关产品推荐
相关产品推荐

