Добро пожаловать в Stackoverflow!
Использование .count()
будет одним из способов проверки существования записи перед ее добавлением. См. Нижеприведенную функцию countTypeNameRec
в качестве примера.
Следующая функция addTypeNameRec
затем складывает и вставляет счетчик, сначала проверяя количество записей, затем, если он равен нулю, добавляет запись.
См. Knex .count() ссылка для получения дополнительной информации об использовании .count()
. (Для больших неиндексированных таблиц использование select * where xxx limit 1
, вероятно, было бы лучшим выбором для повышения производительности.)
Второй метод: Я предполагаю, что это жесткое правило, которое не может иметь тип«Табличные записи с повторяющимися значениями поля type_name». Если это так, то если сделать это поле первичным ключом с помощью определения таблицы SQL в вашей базе данных (или создать уникальный индекс для таблицы для этого поля), это также не позволит пользователям создавать дубликаты записей. В этом случае оператор .insert()
выдаст ошибку в дубликате записи. Но немного ошибочно интерпретировать ошибку, если вы хотите дать пользователю понятное сообщение об ошибке «Значение уже существует». Здесь - обсуждение этой проблемы.
Если вам не нужно возвращать пользователю некрасивую необработанную ошибку базы данных, которую он, вероятно, не поймет, тогда вы можете использовать этот второй методв упрощенном виде и просто вызовите функцию insertTypeNameRec
из кода маршрутизации вместо функции addTypeNameRec
(пропуская проверку счетчика).
Код
// count the records
//
function countTypeNameRec(input_type_name) {
return db('types')
.count('*')
.where('type_name', input_type_name)
.then((data)=>{
return data[0].count
})
}
// insert a new record
//
function insertTypeNameRec(input_type_name) {
return db('types')
.insert({type_name: input_type_name})
}
// Combine the count & insert - the real goal
//
function addTypeNameRec(input_type_name) {
return countTypeNameRec(input_type_name)
.then((rec_count) => {
if (rec_count===0) {
insertTypeNameRec(input_type_name)
} else {
// we can return an already exists error from here
}
})
}
// Web routing code
//
router.post('/additem', function(req, res, next){
const input_type_name = req.body.getypename;
// we could validate our input here
// for simplistic second method - call insertTypeNameRec() here instead
return addTypeNameRec(input_type_name)
.then(()=>{
res.redirect('/additem?success=1')
})
.catch((err)=>{
res.redirect('/additem?'+err)
})
})
// disclaimer: this code has not been tested
Халява (т.е. комментирует вещи, о которых вы не спрашивали) ... Я стараюсь разделить свои возможности на мельчайшие части / функции, которые я могу. Тогда становится супер просто устранять неисправности и тестировать каждый кусок. Я особенно стараюсь отделить код на уровне базы данных и связи. Затем можно просто заглушить веб-запросы и протестировать их отдельно от обработки на другом сервере.