parse - mostrar datos json javascript
Secuela: ¿Cómo puedo devolver solo objetos JSON de los resultados de la base de datos? (4)
Así que quiero que me devuelvan los resultados de la base de datos y nada más. En este momento me están devolviendo una gran parte de los datos de JSON (como a continuación):
Pero solo necesito el atributo [dataValues]. No quiero tener que usar este bit de JSON
para recuperarlo: tagData[0].dataValues.tagId
.
Acabo de darme cuenta: cuando encuentra y NO CREA , devolverá el JSON
para los resultados de la base de datos, pero cuando NO ENCUENTRA y crea, devuelve el JSON no necesario (como a continuación). ¿esta?
[ { 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 ]
En lugar de obtener la burbuja grande como la anterior, solo necesito los resultados RAW
json (como a continuación):
{ 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) },
He usado el siguiente javascript. Intenté agregar raw: true
, ¿pero no funcionó?
// 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);
}
});
}
Editar:
Así que he investigado un poco y parece que el gran blob JSON
solo se devuelve cuando Sequelize
crea y no encuentra.
¿Hay una manera de evitar esto o no?
Edición 2:
Bien, he encontrado una solución que podría convertirse en una función reutilizable. Pero si hay algo incorporado en Sequelize
, prefiero usar eso.
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 })
Edición 3:
Por lo tanto, no creo que exista una forma de secuencia "oficial" para lograr esto, así que simplemente escribí un módulo personalizado que devuelve los datos JSON
que se necesitan. ¡Este módulo se puede personalizar y ampliar para adaptarse a diversas situaciones! Si alguien tiene alguna sugerencia sobre cómo se puede mejorar el módulo, no dude en comentar :)
En este módulo estamos devolviendo un objeto Javascript. Si desea convertirlo en JSON
simplemente túntelo utilizando 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
}
Edición 4:
Así que hay un método de secuela oficial. Consulte la respuesta aceptada a continuación.
Actualizado:
Utilice data.dataValues
db.Message.create({
userID: req.user.user_id,
conversationID: conversationID,
content: req.body.content,
seen: false
})
.then(data => {
res.json({''status'': ''success'', ''data'': data.dataValues})
})
.catch(function (err) {
res.json({''status'': ''error''})
})
Aunque mal documentado, esto existe en Sequelize.
Formas de pareja:
1. Para cualquier objeto de respuesta que resulte de una consulta, puede extraer solo los datos que desee agregando .get({plain:true})
la siguiente manera:
Item.findOrCreate({...})
.spread(function(item, created) {
console.log(item.get({
plain: true
})) // logs only the item data, if it was found or created
Además, asegúrese de utilizar la función de devolución de llamada de spread
para su tipo de promesa de consulta dinámica. Y tenga en cuenta que tiene acceso a una respuesta booleana, created
, que significa si se ejecutó o no una consulta de creación.
2. Sequelize proporciona la opción en raw
. Simplemente agregue la opción {raw:true}
y recibirá solo los resultados en bruto. Esto funcionará en una matriz de resultados, el primer método no debería, ya que get
no será una función de una matriz.
Si desea trabajar solo con los valores de una instancia, intente llamar a get({plain: true})
o toJSON()
tags.findOrCreate( {
where: { tagName: tag }
})
.then(function(tagData){
console.log(tagData.toJSON());
})
sequelize-values
es un módulo npm que te ayuda a hacer esto. Tiene métodos que imprimen fácilmente los valores en un solo elemento y en la lista de resultados (matriz) https://www.npmjs.com/package/sequelize-values