Sequelize-Comment puis-je retourner les objets JSON des résultats de la base de données seulement?
alors je veux que les résultats de la base de données soient retournés et rien d'autre. Pour le moment, je suis retourné une grande partie des données JSON (Comme ci-dessous):
mais je n'ai besoin que de l'attribut [dataValues]. Je ne veux pas avoir à utiliser ce peu de JSON
pour récupérer: tagData[0].dataValues.tagId
.
je viens de remarquer: Quand il trouve et NE CRÉE PAS, il sera de retour l' JSON
pour les résultats de la base de données, mais quand il NE TROUVE PAS et crée, elle renvoie l'onu nécessaire JSON blob (Comme ci-dessous) Est-il un moyen de contourner cela?
[ { 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 la grosse tache comme ci-dessus j'ai seulement besoin de RAW
json résultats (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 il ne fonctionne pas?
// 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:
J'ai donc un peu enquêté et il semble que le grand JSON
blob revient uniquement quand Sequelize
est créateur et non créateur Conclusion.
y a-t-il une solution ou non?
Edit 2:
Ok donc j'ai trouvé une solution, qui pourrait être transformée en une fonction réutilisable. Mais s'il y a quelque chose construit dans Sequelize
, je préférerais utiliser ça.
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 })
Edit 3:
donc, je ne pense pas qu'il y ait une façon "officielle" de sequelize pour réaliser ceci donc j'ai simplement écrit un module personnalisé qui renvoie le JSON
données nécessaires. Ce module peut être personnalisé et étendu pour s'adapter à des situations variées! Si quelqu'un a des suggestions pour 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 transformer en JSON
il suffit de le stringifier 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
}
Edit 4:
il y a donc une méthode officielle de sequelize. Reportez-vous à la réponse acceptée ci-dessous.
4 réponses
bien que mal documenté, cela existe dans Sequelize.
Deux Façons:
1. Pour toute réponse objet qui résulte d'une requête, vous pouvez extraire seulement les données que vous voulez en ajoutant .get({plain:true})
la réponse de la sorte:
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 que vous utilisez le spread
fonction de rappel pour votre type de requête dynamique promesse. Et notez que vous avez accès à un booléen réponse, created
, ce qui signifie si une requête de création a été exécutée ou non.
2. Sequelize fournit le raw
option. Il suffit d'ajouter l'option {raw:true}
et vous ne recevrez que les résultats bruts. Cela fonctionnera sur un tableau de résultats, la première méthode ne devrait pas, comme get
ne sera pas une fonction d'un tableau.
si vous voulez travailler seulement avec le 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 a des méthodes qui imprime facilement les valeurs sur un seul élément et la liste des résultats (tableau)
https://www.npmjs.com/package/sequelize-values
mise à Jour:
Utiliser 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'})
})