删除后的SQLite回调

时间:2019-02-18 18:19:24

标签: node.js sqlite express node-sqlite3

我正在尝试进行删除功能,以确认已删除某些内容。在当前代码行中,如果找不到或删除该行,则该变量变回空。

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。如何区分它们?

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

2 个答案:

答案 0 :(得分:1)

来自this tutorial

  

如果DELETE语句成功执行,则{   回调函数将包含存储的changes属性   删除的行数。

由于不希望有任何结果,因此应考虑将this方法而不是run方法用于DELETE查询。

api doc

的摘录
  

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

...

  

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

答案 1 :(得分:0)

如果其他人点击此页面搜索sqlite3 this.lastIDsqlite 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 方法回调只有一个参数,即错误对象