Подтвердить что ты не робот

Sequelize - Как я могу вернуть объекты JSON только из результатов базы данных?

Итак, я хочу вернуть результаты базы данных и ничего больше. На данный момент я получаю большой кусок данных JSON (как показано ниже):

Но мне нужен только атрибут [dataValues]. Я не хочу использовать этот бит JSON для его получения: tagData[0].dataValues.tagId.

Я только заметил: когда он найдет и НЕ СОЗДАТЬ, он вернет JSON для результатов базы данных, но когда он НЕ НАЙДЕТ и создает, он возвращает ненужный кадр JSON (как показано ниже) Есть ли способ обойти это?

[ { dataValues:
     { tagId: 1,
       tagName: '#hash',
       updatedAt: Fri Dec 25 2015 17:07:13 GMT+1100 (AEDT),
       createdAt: Fri Dec 25 2015 17:07:13 GMT+1100 (AEDT) },
    _previousDataValues:
     { tagId: 1,
       tagName: '#hash',
       createdAt: Fri Dec 25 2015 17:07:13 GMT+1100 (AEDT),
       updatedAt: Fri Dec 25 2015 17:07:13 GMT+1100 (AEDT) },
    _changed:
     { tagId: false,
       tagName: false,
       createdAt: false,
       updatedAt: false },
    '$modelOptions':
     { timestamps: true,
       instanceMethods: {},
       classMethods: {},
       validate: {},
       freezeTableName: true,
       underscored: false,
       underscoredAll: false,
       paranoid: false,
       whereCollection: [Object],
       schema: null,
       schemaDelimiter: '',
       defaultScope: null,
       scopes: [],
       hooks: {},
       indexes: [],
       name: [Object],
       omitNull: false,
       sequelize: [Object],
       uniqueKeys: [Object],
       hasPrimaryKeys: true },
    '$options':
     { isNewRecord: true,
       '$schema': null,
       '$schemaDelimiter': '',
       attributes: undefined,
       include: undefined,
       raw: true,
       silent: undefined },
    hasPrimaryKeys: true,
    __eagerlyLoadedAssociations: [],
    isNewRecord: false },
  true ]

Вместо того, чтобы получать большой капли, как указано выше, мне нужны только результаты RAW json (как показано ниже):

{ tagId: 1,
       tagName: '#hash',
       updatedAt: Fri Dec 25 2015 17:07:13 GMT+1100 (AEDT),
       createdAt: Fri Dec 25 2015 17:07:13 GMT+1100 (AEDT) },

Я использовал следующий javascript. Я попытался добавить raw: true, но это не сработало?

    // Find or create new tag (hashtag), then insert it into DB with photoId relation
module.exports = function(tag, photoId) {
    tags.findOrCreate( { 
        where: { tagName: tag },
        raw: true
    })
    .then(function(tagData){
        // console.log("----------------> ", tagData[0].dataValues.tagId);
        console.log(tagData);
        tagsRelation.create({ tagId: tagData[0].dataValues.tagId, photoId: photoId })
        .then(function(hashtag){
            // console.log("\nHashtag has been inserted into DB: ", hashtag);
        }).catch(function(err){
            console.log("\nError inserting tags and relation: ", err);
        });
    }).catch(function(err){
        if(err){
            console.log(err);
        }
    });

}

Edit:

Итак, я немного исследовал, и кажется, что большой JSON возвращается только тогда, когда Sequelize создает и не находит.

Есть ли способ обойти это или нет?

Изменить 2:

Хорошо, поэтому я нашел обходное решение, которое можно было бы превратить в функцию повторного использования. Но если там что-то встроено в Sequelize, я бы предпочел использовать это.

var tagId = "";

// Extract tagId from json blob
if(tagData[0].hasOwnProperty('dataValues')){
    console.log("1");
    tagId = tagData[0].dataValues.tagId;
} else {
    console.log("2");
    console.log(tagData);
    tagId = tagData[0].tagId;
}

console.log(tagId);
tagsRelation.create({ tagId: tagId, photoId: photoId })

Изменить 3:

Итак, я не думаю, что существует "официальный" способ преследования, поэтому я просто написал настраиваемый модуль, который возвращает требуемые данные JSON. Этот модуль может быть настроен и расширен в соответствии с различными ситуациями! Если у кого-то есть предложения по улучшению модуля, не стесняйтесь комментировать:)

В этом модуле мы возвращаем объект Javascript. Если вы хотите превратить его в JSON, просто выполните его с помощью JSON.stringify(data).

// Pass in your sequelize JSON object
module.exports = function(json){ 
    var returnedJson = []; // This will be the object we return
    json = JSON.parse(json);


    // Extract the JSON we need 
    if(json[0].hasOwnProperty('dataValues')){
        console.log("HI: " + json[0].dataValues);
        returnedJson = json[0].dataValues; // This must be an INSERT...so dig deeper into the JSON object
    } else {
        console.log(json[0]);
        returnedJson = json[0]; // This is a find...so the JSON exists here
    }

    return returnedJson; // Finally return the json object so it can be used
}

Изменить 4:

Таким образом, существует официальный метод sequelize. См. Принятый ответ ниже.

4b9b3361

Ответ 1

Хотя это плохо документировано, это существует в Sequelize.

Пара способов:

1. Для любого ответа объекта, полученного в результате запроса, вы можете извлечь только нужные данные, добавив .get({plain:true}) ответ так: p >

Item.findOrCreate({...})
      .spread(function(item, created) {
        console.log(item.get({
          plain: true
        })) // logs only the item data, if it was found or created

Также убедитесь, что вы используете функцию обратного вызова spread для вашего запроса динамического запроса. Обратите внимание, что у вас есть доступ к логическому отклику created, который означает, был ли выполнен запрос создания.

2. Sequelize предоставляет параметр raw. Просто добавьте опцию {raw:true}, и вы получите только исходные результаты. Это будет работать с массивом результатов, первый метод не должен, так как get не будет функцией массива.

Ответ 2

Если вы хотите wrok только с значениями экземпляра, попробуйте вызвать get({plain: true}) или toJSON()

tags.findOrCreate( { 
    where: { tagName: tag }
})
.then(function(tagData){
     console.log(tagData.toJSON());
})

Ответ 3

sequelize-values - это модуль npm, который поможет вам это сделать. Он имеет методы, которые легко печатают значения как для одного элемента, так и для списка результатов (массива) https://www.npmjs.com/package/sequelize-values