Sequelize, convertir entité à la plaine de l'objet
Je ne suis pas très familier avec le javascript, et magnifique, parce que je ne peux pas ajouter de nouveaux biens, de l'objet, qui récupérés à partir de la base de données à l'aide de l'ORM noms Sequelize.js.
Pour éviter cela, j'ai utiliser ce hack:
db.Sensors.findAll({
where: {
nodeid: node.nodeid
}
}).success(function (sensors) {
var nodedata = JSON.parse(JSON.stringify(node)); //this is my trick
nodedata.sensors = sensors;
nodesensors.push(nodedata);
response.json(nodesensors);
});
Donc, ce qui normalement façon d'ajouter de nouvelles propriétés de l'objet.
Si cela peut aider, j'utilise sequelize-postgres la version 2.0.x.
upd. 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',
rawAttributes:
{ 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 la prochaine, ce que vous pensez être: "Ok, c'est facile, il suffit d'ajouter votre propriété à dataValues."
node.selectedValues.sensors = sensors;
node.dataValues.sensors = sensors;
- Je ajouter ces lignes, et ce n'est pas le travail
node
ne doit pas être un objet traditionnel. C'est peut-être un Tampon? Ce n'console.log(node);
avant votre truc de la ligne de dire?- Veuillez voir le post de mise à jour.
Vous devez vous connecter pour publier un commentaire.
Si je reçois de vous droit, vous voulez ajouter la
sensors
de la collection à lanode
. Si vous avez une correspondance entre les deux modèles, vous pouvez soit utiliser leinclude
fonctionnalité expliqué ici ou lavalues
de lecture définies sur chaque instance. Vous pouvez trouver les docs pour qu'ici.Cette dernière peut être utilisée comme ceci:
Il y a de chance que
nodedata.sensors = sensors
pourrait fonctionner ainsi.vous pouvez utiliser les options de requête
{raw: true}
pour retourner le résultat brut. Votre requête doit comme suit:Pour ceux qui viennent à travers cette question, plus récemment,
.values
est obsolète depuis la Sequelize 3.0.0. Utilisation.get()
au lieu d'obtenir la plaine objet javascript. Donc le code ci-dessus serait de changer d':Sequelize docs ici
.get()
de ne pas convertir inclus associations, utilisez.get({ plain: true })
à la place. Merci pour la mention de la suggestion de la documentation.raw: true
Comme CharlesA notes, dans sa réponse,
.values()
est techniquement obsolète, bien que ce fait n'est pas mentionné explicitement dans la docs. 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, et non pas d'un tableau. Comme indiqué dans la question ci-dessus, Sequelize retourne natif des tableaux d'objets d'instance (et les responsables n'ont pas l'intention de changer cela), alors vous avez à parcourir le tableau vous-même:Meilleur et le moyen le plus simple de le faire est :
Suffit d'utiliser la méthode par défaut de Sequelize
Voici ce que j'utilise pour obtenir la plaine de réponse de l'objet avec les non-stringified valeurs et tous imbriqués les associations de
sequelize
v4 requête.Avec plaine JavaScript (ES2015+):
Avec lodash (un peu plus concis):
Utilisation:
J'ai trouvé une solution qui fonctionne très bien pour imbriquée modèle et le tableau à l'aide de JavaScript natif fonctions.
ou vous pouvez utiliser la fonction map. c'est travaillé pour moi. comme ceci :