0

我正在尝试创建一个删除功能,并确认某些内容已被删除。如果未找到该行或将其删除,则当前代码行变量将返回空。

app.delete('/api/devices/:id', (req, res) => {
    db.all('delete from devices where id = ' + req.params.id, (err, rows) => 
{
        if (err) {
            return res.status(500).send(err)
        }
        else {
            return res.status(204).send()
        }
    })
})

如果找不到,我想返回404,如果它真的被删除了,我想返回204。我如何区分它们?

我知道我可以在删除之前进行选择查询,但必须有更好的方法。

4

2 回答 2

1

本教程

如果DELETE语句执行成功,this回调函数的对象将包含存储删除行数的更改属性。

您应该考虑使用该run方法,而不是allDELETE 查询的方法,因为您不期望任何结果。

api 文档的摘录

使用指定的参数运行 SQL 查询,然后调用回调。它不检索任何结果数据。

...

如果执行成功,此对象将包含两个名为 lastID 的属性,并更改分别包含最后插入的行 ID 的值和受此查询影响的行数。请注意,lastID 仅在查询是成功完成的 INSERT 语句时包含有效信息,而 changes 仅在查询是成功完成的 UPDATE 或 DELETE 语句时包含有效信息。在所有其他情况下,这些属性的内容是不准确的,不应使用。.run() 函数是设置这两个值的唯一查询方法;所有其他查询方法,例如 .all() 或 .get() 都不会检索这些值。

于 2019-02-18T18:48:43.447 回答
1

万一其他人点击此页面搜索sqlite3 this.lastID并在删除查询后sqlite this.changes返回;undefined

上面的代码片段应为:

app.delete('/api/devices/:id', (req, res) => {
  db.run('delete from devices where id = ?', req.params.id, function(err) {
    if (err) return res.status(500).send(err)
    return res.status(204).send(this.lastID) // or this.changes
  })
})

这些是 OP 片段中缺少的东西:

  1. 我们需要run在数据库实例上执行命令,而不是all内存效率低下...
  2. sqlite 查询缺少参数化变量(id)的问号
  3. 如果我们使用箭头函数,this上下文就会丢失
  4. run方法回调只有一个参数,错误对象
于 2021-03-12T09:00:40.713 回答