Javascript 创建hasMany关联的元素

Javascript 创建hasMany关联的元素,javascript,node.js,sequelize.js,Javascript,Node.js,Sequelize.js,第一次问堆栈溢出问题,所以我希望我的措辞正确:我试图构建一个简单的博客应用程序作为家庭作业,同时使用Sequelize进行数据库管理。然而,当我尝试创建与模型关联的元素时,我在尝试创建一些测试数据时遇到了一个问题。这是我的代码,它的语法应该与文档()中的相同 当前行为:两个用户都是使用所有属性创建的,不会创建帖子,也不会给出错误。 masterdb.sync({force:true}).then( x => { return Promise.all([ User.c

第一次问堆栈溢出问题,所以我希望我的措辞正确:我试图构建一个简单的博客应用程序作为家庭作业,同时使用Sequelize进行数据库管理。然而,当我尝试创建与模型关联的元素时,我在尝试创建一些测试数据时遇到了一个问题。这是我的代码,它的语法应该与文档()中的相同

当前行为:两个用户都是使用所有属性创建的,不会创建帖子,也不会给出错误。

masterdb.sync({force:true}).then( x => {
    return Promise.all([
        User.create({
            username:'Timothy',
            password:'plain-text',
            email:'x@msn.nl',
            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:'jacksparrow@msn.nl'
        }),
    ])
}).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)

摆弄你的代码和下面的作品。我对Sequalize一无所知,所以不知道它是否应该像这样工作。但它是有效的:)

你有:

        Posts: [
            { body: 'Hello everyone, my name is Timothy.' },
            { body: 'Today was a good day.'}
        ]
你看到区别了吗

我也有一段时间没有,但你有一个大写字母p,我有一个小写字母p

输出:

testdb=# select * from users; 
 id |   username   |  password  |       email        |         createdAt          |         updatedAt          | deletedAt 
----+--------------+------------+--------------------+----------------------------+----------------------------+-----------
  1 | Jack Sparrow | plain-text | jacksparrow@msn.nl | 2016-11-17 22:38:06.493+01 | 2016-11-17 22:38:06.493+01 | 
  2 | Timothy      | plain-text | x@msn.nl           | 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)
编辑:我想我知道为什么这必须是小写

您对post的定义如下:

const Post = masterdb.define('post', {
如果你想按自己的方式去做,你必须用大写字母p来定义它

我认为这就是问题的原因,因为我试图将Post定义为
Post
,将键定义为
Post
,但它也不起作用。只有当定义和键相同时,它才能工作

奇怪的是,他们确实有一个小写大写字母不规则,就像你一样。可能是他们打错了吗?他们还将“tag”定义为小写的t,而不是大写的t

我修改了你的代码,这样它就可以和他们的教程代码一起使用了,但是没有。当我做我提议的修改时,它确实起了作用——将定义中的小写字母改为大写字母。但是,它们在定义标记时的方式确实略有不同。它们有
var Tag=this.sequelize.definte('Tag',{

然而,您需要有
var Tag=masterdb.define('Tag',{

可能是因为
这个。续集

这是您的代码及其教程代码的工作版本。我将数据库重命名为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:'x@msn.nl',
            Tags: [
            { name: 'Alpha'},
            { name: 'Beta'}
          ]
        }, {
          include: [ Tag ]
        }),
        User.create({
            username:'Jack Sparrow', 
            password:'plain-text', 
            email:'jacksparrow@msn.nl'
        }),
    ])
}).catch(x => console.log(x))

你还没有定义外键,为什么主体是唯一的?如果它是一个帖子,你就不能有两个相同的text@yBrodsky当我声明关系时,外键不是自动正确设置的吗?在Postgres中,posts表当前通过userID列链接到users表。具有唯一属性的Body不应被忽略对于这个问题,我的目的是防止人们(或机器人)滥发帖子。如果表中已经创建了外键,请将其添加到帖子模型定义中的字段中,并在定义关系时添加它。User.hasMany(Post,{foreignKey:'yourFK'})。此外,您还应该以另一种方式定义关系,Post.belongsTo(用户,{foreignKey:'bla'});@yBrodsky这两个问题你都是对的,我刚刚更新了我的代码以包含belongsTo关系和显式定义的外键。但是问题一直在发生。被接受的答案解决了它!哇,是的,完全按照定义的字符串解决了它。除此之外,唯一的区别是他们如何使用this.sequelize.define,而我可以我不知道该怎么做。我会在Sequelize GitHub上对此提出问题。谢谢!在我的测试代码中,当我控制台记录
this
时,我得到了
{}
返回。我不知道会发生什么,但我不希望看到一个空对象。在GitHub上得到一个响应,它是文档中的一个bug。“属性的名称(用户)必须与关联(用户)的名称匹配“
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:'x@msn.nl',
            Tags: [
            { name: 'Alpha'},
            { name: 'Beta'}
          ]
        }, {
          include: [ Tag ]
        }),
        User.create({
            username:'Jack Sparrow', 
            password:'plain-text', 
            email:'jacksparrow@msn.nl'
        }),
    ])
}).catch(x => console.log(x))