【问题标题】:Sequelize, get id after findOrCreateSequelize,findOrCreate后获取id
【发布时间】:2018-05-09 11:10:18
【问题描述】:

我尝试用标签的 id 和相关文章的 id 创建一个关联的标签表,所以首先我做了一个 findOrCreate 标签,这个函数是可操作的并且工作得很好,但是当我做一个 then(function(result){ }),结果我创建了与标签的 id 的关联,如 result.id 返回的 id 为 null !因此,在我执行简单创建的情况下,它会返回一个 id,但是当我执行 findOrCreate 时,id 为 null !我该怎么做才能使用 findOrCreate 函数获取我创建的条目的 ID?如果有另一种解决方案来创建一个尚不存在的条目我也很感兴趣....这是我在 app.js 中的函数

 function(sales, callback) {
      if(req.body.tags) {
            tagsArray = req.body.tags.split(',');
            var obj = tagsArray.reduce(function(acc, cur, i) {
                          acc[i] = cur;
                          return acc;
                        }, {});

            callback(null, async.forEachOf(obj, (value,key,callback) => {
                tagsFormattedArray.push({tags: value})
                tagsController.create(req, res, value).then(function(result){
                        callback(null, tagSpottingController.create(req, res, result.id, idCreation))
                     })
            }))
      } 
 }

这是我的标签控制器:

module.exports = {
    create(req, res, tag) {
        return Tags
          .findOrCreate({
            where: {
            name: tag
         },
        defaults: { 
           name: tag
        }
   })
 }
};

这是我的标签模型:

module.exports = (sequelize, DataTypes) => {
    const Tags = sequelize.define('Tags', {
        id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true
        },
        name: {
          type: DataTypes.STRING
        },

        createdAt: {
            type: DataTypes.DATE,
            field: 'createdAt'
         },

        updatedAt: {
           type: DataTypes.DATE,
           field: 'updatedAt'
      }},{
        timestamps: true

    });

  return Tags;
}

我阅读了文档并在我的标签控制器中进行了测试:

module.exports = {
    findOrCreate(req, res, tag) {
        return Tags
          .findOrCreate({
            where: {
              name: tag
           },
           defaults: { 
             name: tag
           }
     }).spread((tags, created) => {
       console.log(tags.get({
          plain: true
       }))
  })
 }
};

它控制台记录我创建的所有标签(不在数据库中的标签)我想要的行为!...但是当我尝试返回而不是控制台日志时,为了获取我的 ID,它只返回错误的结果(数据库中已经存在的结果)...有一些我不明白的东西

【问题讨论】:

  • 能否请您格式化一下您的代码。并提供您迄今为止尝试过的内容。
  • 我已经编辑了我的帖子

标签: javascript express sequelize.js unique


【解决方案1】:

似乎我们不能直接返回传播的结果,所以我不得不将它推送到回调中。这是我的最终代码:

  tagsController.findOrCreate(req, res, value).spread(function(tags, created){
                    if (created){
                        callback(null, tagSpottingController.create(req, res, tags.id, idCreation))
                    }
                    else {
                        callback(null, tagSpottingController.create(req, res, tags.id, idCreation))
                    }  
                 })

【讨论】:

    猜你喜欢
    • 2013-05-19
    • 2016-04-12
    • 2020-12-01
    • 2018-04-05
    • 2014-01-05
    • 1970-01-01
    • 2020-11-10
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多