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()