使用SequelizeJS查找或创建

6

我尝试使用SequelizeJS的“findOrCreate”函数,但它不起作用。

变量“created”是“未定义”的,所以我不知道为什么,因为它是SequelizeJS使用的变量...

for( var i = 0; i < tags.length; i++ ){
    global.db.Tag.findOrCreate({name: tags[i]}).success( function(tag, created){
        if( created ){
            global.db.PostTag.create({
                PostId: id,
                TagId: tag.id
            });
        }
    });
}

你使用的是哪个版本?我认为更改可能尚未发布到npm,所以你可以尝试使用github.com/sequelize/sequelize上的最新版本。 - Jan Aagaard Meier
4个回答

3

我也遇到了同样的问题。将版本从1.7.0-alpha2升级到2.0.0-alpha2解决了问题。 干杯!


3

对我来说,答案是将我的promise解决程序从.then更改为.spread。这与Sequelize返回数据的格式有关。

for( var i = 0; i < tags.length; i++ ){
    global.db.Tag.findOrCreate({
        name: tags[i]
    }).spread( function(tag, created){
        if( created ){
            global.db.PostTag.create({
                PostId: id,
                TagId: tag.id
            });
        }
    });
}

2
这是正确的。.spread是处理 findOrCreate 的正确方式,适用于任何遇到此问题的人。根据 Sequelize 文档所述:“默认情况下,该函数将返回两个参数:结果数组和元数据对象,包含受影响行数等信息。使用 .spread 来访问结果。” http://docs.sequelizejs.com/class/lib/sequelize.js~Sequelize.html - Matthew
1
你也可以直接使用await,它会给你一个包含两个元素的数组,然后你可以解构或者获取第一个元素[0] - Ray Toal

1

0

昨天我们遇到了这个问题,但是我们已经成功解决了:

Tag.findOrCreate({
     where: { condition: value },
     // in the event that it is not found
     defaults: { /* properties of the model to create */ }
 })
     .then(tag => res.send(tag))
     .catch(err => res.send(err))`

返回:

{
    {
        /* tagProperties */
    },
    /* true if the tag was created
       false if the tag was found */
}

2
欢迎来到 Stack Overflow。在 Stack Overflow 上,我们不鼓励仅包含代码的答案,因为它们无法解释如何解决问题。请编辑您的答案,解释这段代码的作用以及如何回答问题,这样对提问者和其他遇到类似问题的用户都有帮助。 - FluffyKitten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接