Sequelize, получить идентификатор после findOrCreate - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь создать связанную таблицу тегов с идентификатором тега и идентификатором связанной статьи, поэтому сначала я делаю тег findOrCreate, эта функция работает и работает отлично, но когда я делаю тогда (функция (результат) { }) и с результатом я создаю свою ассоциацию с идентификатором тега как result.id возвращенный идентификатор является нулевым! Так что в случае, когда я делаю простое создание, он возвращает мне идентификатор, но когда я делаю findOrCreate, идентификатор равен нулю !! Что я могу сделать, чтобы получить идентификатор моей созданной записи с помощью функции findOrCreate? если есть другое решение для создания записи, которая еще не существует, я также заинтересован .... вот моя функция в 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
       }))
  })
 }
};

Консоль регистрирует все мои созданные теги (те, которых нет в БД) того поведения, которое я хотел! ... но когда я пытаюсь сделать возврат вместо журнала консоли, чтобы получить мои идентификаторы, это возвращает мне только ложный результат (тот, который уже существует в БД) ... есть что-то, чего я не понимаю

1 Ответ

0 голосов
/ 09 мая 2018

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

  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))
                    }  
                 })
...