2016-11-17 3 views
4

Впервые задал вопрос о переполнении стека, поэтому, надеюсь, я правильно его сформулирую: я пытаюсь создать простое приложение для блога как домашнее задание при использовании Sequelize для управления базой данных. Тем не менее, у меня возникла проблема при попытке создать некоторые тестовые данные, когда я пытаюсь создать элементы, связанные с моей моделью. Вот мой код, он должен быть того же синтаксиса, что и в документации (http://docs.sequelizejs.com/en/v3/docs/associations/#creating-elements-of-a-hasmany-or-belongstomany-association).Создание элементов ассоциации hasMany

Текущее поведение: оба пользователя созданы со всеми атрибутами, сообщения не создаются вообще и никаких ошибок не выдаются.

masterdb.sync({force:true}).then(x => { 
    return Promise.all([ 
     User.create({ 
      username:'Timothy', 
      password:'plain-text', 
      email:'[email protected]', 
      Posts: [ 
       { body: 'Hello everyone, my name is Timothy.' }, 
       { body: 'Today was a good day.'} 
      ] 
     }, { 
      include: [ Post ] 
     }), 
     User.create({ 
      username:'Jack Sparrow', 
      password:'plain-text', 
      email:'[email protected]' 
     }), 
    ]) 
}).catch(x => console.log(x)) 

А вот мои модели и отношения декларации:

const Sequelize = require('sequelize') 
const masterdb = new Sequelize('blogapplication', process.env.POSTGRES_USER, process.env.POSTGRES_PASSWORD, { 
    dialect: 'postgres', 
}) 
const User = masterdb.define('user', { 
    username: { 
     type: Sequelize.STRING, 
     unique: true, 
     allowNull: false 
    }, 
    password: { 
     type: Sequelize.STRING, 
     allowNull: false 
    }, 
    email: { 
     type: Sequelize.STRING, 
     unique: true, 
     allowNull: false 
    } 
}, { 
    paranoid: true 
}) 

const Post = masterdb.define('post', { 
    body: { 
     type: Sequelize.STRING(9001), 
     allowNull: false, 
     unique:true, 
    } 
}, { 
    paranoid: true 
}) 

User.hasMany(Post) 
+0

У вас нет внешних ключей определяется – yBrodsky

+0

Кроме того, почему это тело уникально? Если это сообщение, вы не сможете иметь два с тем же текстом. – yBrodsky

+0

@yBrodsky. Не являются ли внешние ключи автоматически заданы правильно, когда я объявляю отношения? В Postgres таблица posts теперь привязана к таблице пользователей через столбец userID. Тело, имеющее уникальный атрибут, не должно иметь значения для этой проблемы, но мое намерение состояло в том, чтобы помешать людям (или ботам) со спам-постов. –

ответ

2

возился с вашим кодом и следующих работ. Я ничего не знаю о Sequalize, так что не знаю, будет ли это работать так. Но это работает :)

  posts: [ 
       { body: 'Hello everyone, my name is Timothy.' }, 
       { body: 'Today was a good day.'} 
      ] 

Вы были:

 Posts: [ 
      { body: 'Hello everyone, my name is Timothy.' }, 
      { body: 'Today was a good day.'} 
     ] 

Вы видите разницу?

я не сделал ни на некоторое время, но у вас есть капитал P и у меня есть строчная р.

Выход:

testdb=# select * from users; 
id | username | password |  email  |   createdAt   |   updatedAt   | deletedAt 
----+--------------+------------+--------------------+----------------------------+----------------------------+----------- 
    1 | Jack Sparrow | plain-text | [email protected] | 2016-11-17 22:38:06.493+01 | 2016-11-17 22:38:06.493+01 | 
    2 | Timothy  | plain-text | [email protected]   | 2016-11-17 22:38:06.492+01 | 2016-11-17 22:38:06.492+01 | 
(2 rows) 

testdb=# select * from posts; 
id |    body     |   createdAt   |   updatedAt   | deletedAt | userId 
----+-------------------------------------+----------------------------+----------------------------+-----------+-------- 
    1 | Hello everyone, my name is Timothy. | 2016-11-17 22:38:06.515+01 | 2016-11-17 22:38:06.515+01 |   |  2 
    2 | Today was a good day.    | 2016-11-17 22:38:06.515+01 | 2016-11-17 22:38:06.515+01 |   |  2 
(2 rows) 

Edit: Я думаю, я знаю, почему это должно быть в нижнем регистре.

Вы определили пост следующим образом:

const Post = masterdb.define('post', { 

Если вы хотите сделать это ваш путь, вы должны определить его с капиталом P.

Я думаю, что это причина вашей проблемы, потому что я пытался определить должности как Post, а ключ как post, а затем он тоже не работает. Только тогда, когда определение и ключ одинаковы, он работает.

Странно, что в docs of sequelize у них есть неправильная строчная буква, как и вы. Может быть, они сделали опечатку? Они также определили «тег» в нижнем регистре t вместо верхнего регистра T.

Я адаптировал ваш код так, чтобы он «работал» с их учебным кодом, но это не так. Это сработало, когда я сделал свое предложенное изменение - сменив строчную букву в определении на большую букву. Тем не менее, они имеют несколько иной способ определения того, что такое тег. У них есть var Tag = this.sequelize.definte('tag', {.

Принимать во внимание, что у вас есть var Tag = masterdb.define('tag', {.

Может быть, их код также работает из-за this.sequelize?

Вот ваш код с рабочей версией их учебного кода.Я переименовал базу данных для TestDB и поставить комментарий для соответствующей строки, что я изменилась:

const Sequelize = require('sequelize') 
const masterdb = new Sequelize('testdb', process.env.POSTGRES_USER, process.env.POSTGRES_PASSWORD, { 
    dialect: 'postgres', 
}) 
const User = masterdb.define('user', { 
    username: { 
     type: Sequelize.STRING, 
     unique: true, 
     allowNull: false 
    }, 
    password: { 
     type: Sequelize.STRING, 
     allowNull: false 
    }, 
    email: { 
     type: Sequelize.STRING, 
     unique: true, 
     allowNull: false 
    } 
}, { 
    paranoid: true 
}) 

var Tag = masterdb.define('Tag', { //this is 'tag' in their tutorial 
    name: Sequelize.STRING 
}, { 
    paranoid: true 
}) 

User.hasMany(Tag) 

masterdb.sync({force:true}).then(x => { 
    return Promise.all([ 
     User.create({ 
      username:'Timothy', 
      password:'plain-text', 
      email:'[email protected]', 
      Tags: [ 
      { name: 'Alpha'}, 
      { name: 'Beta'} 
      ] 
     }, { 
      include: [ Tag ] 
     }), 
     User.create({ 
      username:'Jack Sparrow', 
      password:'plain-text', 
      email:'[email protected]' 
     }), 
    ]) 
}).catch(x => console.log(x)) 
+0

Wow да, называя его точно так же, как определенная строка его решает. Кроме того, единственное различие заключается в том, как они используют this.sequelize.define, тогда как я не могу заставить это работать с этим. Я расскажу об этом в Sequelize GitHub. Благодаря! –

+0

В моем тестовом коде, когда я консоль регистрировал 'this', я получил' {} 'назад. Я не знал, чего ожидать, но я не ожидал пустого объекта. –

+1

Получил ответ на Github, что это ошибка в документации. «Имя атрибута (Пользователь) должно совпадать с именем ассоциации (пользователя)» https://github.com/sequelize/sequelize/issues/6882 –

Смежные вопросы