Итак, я хочу вернуть результаты базы данных и ничего больше. На данный момент я получаю большой кусок данных 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. См. Принятый ответ ниже.