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.

23
demandé sur James111 2015-12-25 09:11:53

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.

18
répondu rambossa 2017-01-26 18:13:57

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());
})
4
répondu Rudolf Manusachi 2018-08-14 19:11:23

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

0
répondu Abdul Vajid 2017-06-15 07:12:56

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'})
  })
0
répondu Feed Git 2018-09-30 09:00:43