[node.js] Sequelize, 엔티티를 일반 객체로 변환

저는 자바 스크립트에 익숙하지 않고 놀랍습니다. ORM 이름 Sequelize.js를 사용하여 데이터베이스에서 가져온 새 속성을 개체에 추가 할 수 없기 때문입니다.

이를 피하기 위해 다음 해킹을 사용합니다.

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

따라서 일반적으로 객체에 새 속성을 추가하는 방법은 무엇입니까?

도움이된다면 sequelize-postgres 버전 2.0.x를 사용합니다.

upd. console.log (노드) :

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

다음으로, “좋아요. 간단합니다. 속성을 dataValues에 추가하기 만하면됩니다.”라고 생각합니다.

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

이 줄을 추가했는데 작동하지 않습니다.



답변

내가 맞다면 sensors컬렉션을 node. 두 모델간에 매핑이있는 경우 여기에 설명include기능을 사용 하거나 모든 인스턴스에 정의 된 getter를 사용할 수 있습니다 . 여기 에서 문서 찾을 수 있습니다 .values

후자는 다음과 같이 사용할 수 있습니다.

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

nodedata.sensors = sensors작동 할 수 있는 기회 도 있습니다.


답변

쿼리 옵션 {raw: true}을 사용 하여 원시 결과를 반환 할 수 있습니다. 쿼리는 다음과 같아야합니다.

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

또한 include그것 과 연관이 있다면 평평 해집니다. 따라서 다른 매개 변수를 사용할 수 있습니다.nest:true

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


답변

이 질문을 더 최근 .values에 접한 사람들을 위해 Sequelize 3.0.0에서 더 이상 사용되지 않습니다. .get()대신 사용 하여 일반 자바 스크립트 개체를 가져옵니다. 따라서 위의 코드는 다음과 같이 변경됩니다.

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

여기에서 문서 속편


답변

가장 좋고 간단한 방법은 다음과 같습니다.

Sequelize 의 기본 방법을 사용하십시오.

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

참고 : [options.raw] : 원시 결과를 반환합니다. 자세한 내용은 sequelize.query를 참조하십시오.


중첩 된 결과의 경우 / 모델을 포함하는 경우 최신 버전의 sequlize,

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


답변

그의 대답에 CharlesA 사항으로 .values()되어 기술적으로 사용되지 않는 이 사실을 명시 적으로 언급되지 않고 있지만, 문서 . { raw: true }쿼리에서 사용하지 않으려는 경우 선호되는 접근 방식은 .get()결과 를 호출 하는 것입니다.

.get()그러나은 배열이 아닌 인스턴스의 메서드입니다. 위의 링크 된 문제에서 언급했듯이 Sequelize는 인스턴스 객체의 네이티브 배열을 반환하므로 (관리자는이를 변경할 계획이 없으므로) 배열을 직접 반복해야합니다.

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


답변

지도 기능을 사용할 수 있습니다. 이것은 나를 위해 일했습니다.

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


답변

네이티브 JavaScript 함수를 사용하여 중첩 된 모델 및 배열에 대해 잘 작동하는 솔루션을 찾았습니다.

var results = [{},{},...]; //your result data returned from sequelize query
var jsonString = JSON.stringify(results); //convert to string to remove the sequelize specific meta data

var obj = JSON.parse(jsonString); //to make plain json
// do whatever you want to do with obj as plain json