저는 자바 스크립트에 익숙하지 않고 놀랍습니다. 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