Bookhelf js save() команда не обновляет строки в postgresql db
JS beginner пытается получить DB PostgreSQL, говорящий с express.js через bookshelf.js.
github: https://github.com/duskyshelf/bookers-academy/blob/master/booker.js
var knex = require('knex')({
client: 'pg',
connection: "postgres://localhost/bookers"
});
var bookshelf = require('bookshelf')(knex);
var User = bookshelf.Model.extend({
tableName: 'users'
});
var bob = new User({id: 2});
bob.save()
bookshelf.js кажется неспособным добавить какой-либо контент в db.
Текущее сообщение об ошибке: "Необработанное отклонение CustomError: обновлено без строк"
Ответы
Ответ 1
Когда вы создаете свою модель, предоставляя свой собственный идентификатор, например,
var bob = new User({id: 2});
Книжная полка предполагает, что это операция update, а не вставка. Он присваивает внутреннему атрибуту isNew
значение false, а при вызове save()
вместо INSERT INTO user(id, ...) VALUES (2, ...);
он выполняет UPDATE user ... WHERE id = 2;
.
Если нет пользователя с id = 2
, обновление будет почти тихо НИЧЕГО.
Чтобы заставить вставку, вы должны изменить save() на:
bob.save(null, {method: 'insert'});
Книжная полка save() документация описывает это поведение.
Ответ 2
Создал ли пользователь таблицу с помощью knex? Одна из потенциальных проблем, о которых я могу думать, заключается в том, что у вас нет никакой логики, которая фактически создает таблицу для вашей базы данных Postgres. Вот пример кода, который создаст таблицу в вашей базе данных, если она еще не существует.
bookshelf.knex.schema.hasTable('User').then(function(exists) {
if(!exists) {
bookshelf.knex.schema.createTable('User'), function(user) {
user.increments('id').primary();
user.timestamps();
}).then(function(table){
console.log('Created Table:', table);
});
}
});
Ответ 3
new User({id: 2}).
save().
then((model) => {
res.json({ success: true });
});
Ответ 4
Нет, нет! новый пользователь возвращает PROMISE! Вы не можете использовать его так.
Попробуйте
new User().save()