Sequelize, convertit l’entité en object brut

Je ne suis pas très familier avec le javascript, et stupéfiant, car je ne peux pas append de nouvelles propriétés, pour objecter, qui ont été extraites de la firebase database en utilisant les noms ORM Sequelize.js.

Pour éviter cela, j’utilise ce hack:

db.Sensors.findAll({ where: { nodeid: node.nodeid } }).success(function (sensors) { var nodedata = JSON.parse(JSON.ssortingngify(node)); // this is my sortingck nodedata.sensors = sensors; nodesensors.push(nodedata); response.json(nodesensors); }); 

Alors, comment append de nouvelles propriétés à l’object?

Si cela peut aider, j’utilise sequelize-postgres version 2.0.x.

mise à jour console.log (noeud):

 { dataValues: { nodeid: 'NodeId', name: 'NameHere', altname: 'Test9', longname: '', latitude: 30, longitude: -10, networkid: 'NetworkId', farmid: '5', lastheard: Mon Dec 09 2013 04:04:40 GMT+0300 (FET), id: 9, createdAt: Tue Dec 03 2013 01:29:09 GMT+0300 (FET), updatedAt: Sun Feb 23 2014 01:07:14 GMT+0300 (FET) }, __options: { timestamps: true, createdAt: 'createdAt', updatedAt: 'updatedAt', deletedAt: 'deletedAt', touchedAt: 'touchedAt', instanceMethods: {}, classMethods: {}, validate: {}, freezeTableName: false, underscored: false, syncOnAssociation: true, paranoid: false, whereCollection: { farmid: 5, networkid: 'NetworkId' }, schema: null, schemaDelimiter: '', language: 'en', defaultScope: null, scopes: null, hooks: { beforeCreate: [], afterCreate: [] }, omitNull: false, hasPrimaryKeys: false }, hasPrimaryKeys: false, selectedValues: { nodeid: 'NodeId', name: 'NameHere', longname: '', latitude: 30, longitude: -110, networkid: 'NetworkId', farmid: '5', lastheard: Mon Dec 09 2013 04:04:40 GMT+0300 (FET), id: 9, createdAt: Tue Dec 03 2013 01:29:09 GMT+0300 (FET), updatedAt: Sun Feb 23 2014 01:07:14 GMT+0300 (FET), altname: 'Test9' }, __eagerlyLoadedAssociations: [], isDirty: false, isNewRecord: false, daoFactoryName: 'Nodes', daoFactory: { options: { timestamps: true, createdAt: 'createdAt', updatedAt: 'updatedAt', deletedAt: 'deletedAt', touchedAt: 'touchedAt', instanceMethods: {}, classMethods: {}, validate: {}, freezeTableName: false, underscored: false, syncOnAssociation: true, paranoid: false, whereCollection: [Object], schema: null, schemaDelimiter: '', language: 'en', defaultScope: null, scopes: null, hooks: [Object], omitNull: false, hasPrimaryKeys: false }, name: 'Nodes', tableName: 'Nodes', rawAtsortingbutes: { nodeid: [Object], name: [Object], altname: [Object], longname: [Object], latitude: [Object], longitude: [Object], networkid: [Object], farmid: [Object], lastheard: [Object], id: [Object], createdAt: [Object], updatedAt: [Object] }, daoFactoryManager: { daos: [Object], sequelize: [Object] }, associations: {}, scopeObj: {}, primaryKeys: {}, primaryKeyCount: 0, hasPrimaryKeys: false, autoIncrementField: 'id', DAO: { [Function] super_: [Function] } } } 

Je pense que ce que vous pensez sera: “Ok, c’est facile, ajoutez simplement votre propriété à dataValues.”

 node.selectedValues.sensors = sensors; node.dataValues.sensors = sensors; 

J’ajoute ces lignes, et cela ne fonctionne pas

Si je vous comprends bien, vous souhaitez append la collection de sensors au node . Si vous avez un mappage entre les deux modèles, vous pouvez utiliser la fonctionnalité include expliquée ici ou les values définies sur chaque instance. Vous pouvez trouver les documents pour cela ici .

Ce dernier peut être utilisé comme ceci:

 db.Sensors.findAll({ where: { nodeid: node.nodeid } }).success(function (sensors) { var nodedata = node.values; nodedata.sensors = sensors.map(function(sensor){ return sensor.values }); // or nodedata.sensors = sensors.map(function(sensor){ return sensor.toJSON() }); nodesensors.push(nodedata); response.json(nodesensors); }); 

Il y a des chances que nodedata.sensors = sensors puisse également fonctionner.

vous pouvez utiliser les options de requête {raw: true} pour renvoyer le résultat brut. Votre requête devrait ressembler à ceci:

 db.Sensors.findAll({ where: { nodeid: node.nodeid }, raw: true, }) 

Pour ceux qui rencontrent cette question plus récemment, .values est obsolète à partir de Sequelize 3.0.0. Utilisez .get() pour obtenir l’object JavaScript simple. Ainsi, le code ci-dessus deviendrait:

 var nodedata = node.get({ plain: true }); 

Sequelize docs ici

Comme le note CharlesA dans sa réponse, .values() est techniquement obsolète , bien que ce fait ne soit pas explicitement noté dans les documents . Si vous ne souhaitez pas utiliser { raw: true } dans la requête, il est préférable d’appeler .get() sur les résultats.

.get() , cependant, est une méthode d’une instance, pas d’un tableau. Comme indiqué dans le problème lié ci-dessus, Sequelize renvoie les tableaux natifs d’objects d’instance (et les responsables n’envisagent pas de les modifier). Vous devez donc parcourir le tableau vous-même:

 db.Sensors.findAll({ where: { nodeid: node.nodeid } }).success((sensors) => { const nodeData = sensors.map((node) => node.get({ plain: true })); }); 

Le meilleur et le plus simple est de:

Utilisez simplement le mode par défaut de Sequelize

 db.Sensors.findAll({ where: { nodeid: node.nodeid }, raw : true // <----------- Magic is here }).success(function (sensors) { console.log(sensors); }); 

Note: [options.raw]: Retourne le résultat brut. Voir sequelize.query pour plus d'informations.

J’ai trouvé une solution qui fonctionne bien pour un modèle nested et un tableau utilisant des fonctions JavaScript natives.

 var results = [{},{},...]; //your result data returned from sequelize query var jsonSsortingng = JSON.ssortingngify(results); //convert to ssortingng to remove the sequelize specific meta data var obj = JSON.parse(jsonSsortingng); //to make plain json // do whatever you want to do with obj as plain json 

Voici ce que j’utilise pour obtenir un object de réponse simple avec des valeurs non-ssortingngifiées et toutes les associations nestedes de sequelize v4 query.

Avec JavaScript simple (ES2015 +):

 const toPlain = response => { const flattenDataValues = ({ dataValues }) => { const flattenedObject = {}; Object.keys(dataValues).forEach(key => { const dataValue = dataValues[key]; if ( Array.isArray(dataValue) && dataValue[0] && dataValue[0].dataValues && typeof dataValue[0].dataValues === 'object' ) { flattenedObject[key] = dataValues[key].map(flattenDataValues); } else if (dataValue && dataValue.dataValues && typeof dataValue.dataValues === 'object') { flattenedObject[key] = flattenDataValues(dataValues[key]); } else { flattenedObject[key] = dataValues[key]; } }); return flattenedObject; }; return Array.isArray(response) ? response.map(flattenDataValues) : flattenDataValues(response); }; 

Avec lodash (un peu plus concis):

 const toPlain = response => { const flattenDataValues = ({ dataValues }) => _.mapValues(dataValues, value => ( _.isArray(value) && _.isObject(value[0]) && _.isObject(value[0].dataValues) ? _.map(value, flattenDataValues) : _.isObject(value) && _.isObject(value.dataValues) ? flattenDataValues(value) : value )); return _.isArray(response) ? _.map(response, flattenDataValues) : flattenDataValues(response); }; 

Utilisation :

 const res = await User.findAll({ include: [{ model: Company, as: 'companies', include: [{ model: Member, as: 'member', }], }], }); const plain = toPlain(res); // 'plain' now contains simple db object without any getters/setters with following structure: // [{ // id: 123, // name: 'John', // companies: [{ // id: 234, // name: 'Google', // members: [{ // id: 345, // name: 'Paul', // }] // }] // }] 

ou vous pouvez utiliser la fonction de carte. Ceci est travaillé pour moi. comme ça :

 db.Sensors .findAll({ where: { nodeid: node.nodeid } }) .map(el => el.get({ plain: true })) .then((rows)=>{ response.json( rows ) });