recorrer parse objetos objeto mostrar guardar ejemplos ejemplo datos convertir array agregar javascript json sequelize.js

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()); })