Обратный вызов SQLite после удаления

Я пытаюсь сделать функцию удаления с подтверждением того, что что-то было удалено. При текущем коде строки переменная возвращается пустой, если строка не найдена или была удалена.

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 ответа

Решение

Из этого урока

В случае, если DELETE заявление выполнено успешно, this Объект функции обратного вызова будет содержать свойство changes, в котором хранится количество удаленных строк.

Вы должны рассмотреть возможность использования run метод, а не all метод для запроса DELETE, так как вы не ожидаете никаких результатов.

Выдержки из документа API

Запускает SQL-запрос с указанными параметрами и вызывает обратный вызов. Он не извлекает никаких данных результатов.

...

Если выполнение было успешным, объект this будет содержать два свойства с именем lastID и изменения, которые содержат значение идентификатора последней вставленной строки и количество строк, затронутых этим запросом соответственно. Обратите внимание, что lastID содержит только действительную информацию, когда запрос был успешно завершен оператор INSERT, а изменения содержат только действительную информацию, когда запрос был успешно завершен оператор UPDATE или DELETE. Во всех остальных случаях содержание этих свойств неточно и не должно использоваться. Функция.run() является единственным методом запроса, который устанавливает эти два значения; все другие методы запроса, такие как.all() или.get(), не получают эти значения.

На случай, если кто-то еще попадет на эту страницу в поисках 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. нам нужно выполнить команду на экземпляре базы данных, а не allчто, кстати, неэффективно с памятью...
  2. в запросе sqlite отсутствовал знак вопроса для параметризованной переменной (идентификатор)
  3. в thisконтекст теряется, если мы используем стрелочные функции
  4. в runобратный вызов метода имеет только один параметр, объект ошибки
Другие вопросы по тегам