Sequelize – Comment puis-je retourner les objets JSON des résultats de la base de données uniquement?

Je souhaite donc que les résultats de la base de données soient retournés et rien d'autre. Pour le moment, je reçois un grand nombre de données JSON (comme ci-dessous):

Mais j'ai seulement besoin de l'attribut [dataValues]. Je ne veux pas devoir utiliser ce bit de JSON pour le récupérer: tagData[0].dataValues.tagId .

Je viens de remarquer: quand il trouve et NE CRETE PAS , il retournera le JSON pour les résultats de la base de données, mais quand il NE TROUVE PAS et ne crée pas, il renvoie le blob JSON inutile (comme ci-dessous) Existe-t-il un moyen de contourner ce?

 [ { 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 ] 

Au lieu d'obtenir le gros blob comme ci-dessus, j'ai seulement besoin des résultats RAW json (comme ci-dessous):

 { 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) }, 

J'ai utilisé le javascript suivant. J'ai essayé d'ajouter raw: true , mais ça n'a pas fonctionné?

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

Modifier:

J'ai donc étudié un peu et il semble que le grand bloc JSON ne soit retourné que lorsque Sequelize crée et ne trouve pas.

Y a-t-il un moyen de le faire ou non?

Modifier 2:

D'accord, j'ai trouvé une solution de contournement, qui pourrait être transformée en une fonction réutilisable. Mais s'il y a quelque chose construit dans Sequelize , je préférerais l'utiliser.

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

Modifier 3:

Donc, je ne pense pas qu'il y ait une manière "officielle" de segaliser pour y parvenir, alors j'ai simplement écrit un module personnalisé qui renvoie les données JSON nécessaires. Ce module peut être personnalisé et étendu à différentes situations! Si quelqu'un a des suggestions sur la façon dont le module peut être amélioré, n'hésitez pas à commenter 🙂

Dans ce module, nous retournons un objet Javascript. Si vous voulez le transformer en JSON suffit de le faire en utilisant 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 } 

Modifier 4:

Il existe donc une méthode officielle de mise à jour. Reportez-vous à la réponse acceptée ci-dessous.

Bien que peu documenté, cela existe dans Sequelize.

Mode Couple:

1. Pour tout objet de réponse résultant d'une requête, vous pouvez extraire uniquement les données que vous souhaitez en ajoutant .get({plain:true}) la réponse comme .get({plain:true}) :

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

Assurez-vous également d'utiliser la fonction de rappel de spread pour votre type de promesse de requête dynamique. Et notez que vous avez accès à une réponse booléenne created , ce qui signifie si oui ou non une requête de création a été exécutée.

2. Sequelize fournit l'option raw . Il suffit d'ajouter l'option {raw:true} et vous ne recevrez que les résultats bruts. Cela fonctionnera sur un ensemble de résultats, la première méthode ne devrait pas, car la fonction n'aura pas fonction d'un tableau.

Si vous voulez utiliser uniquement les valeurs d'une instance, essayez d'appeler get({plain: true}) ou toJSON()

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

sequelize-values est un module npm qui vous aide à le faire. Il comporte des méthodes qui imprime facilement les valeurs sur l'élément unique et la liste des résultats (tableau) https://www.npmjs.com/package/sequelize-values