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