RowDataPacket 객체에 액세스하는 방법
저는 현재 Node-webkit을 사용하여 데스크톱 애플리케이션을 개발하고 있습니다.이 과정에서 로컬 MySQL 데이터베이스에서 데이터를 가져와야 합니다.
쿼리는 정상적으로 실행되지만 결과에 액세스하는 방법을 알 수 없습니다.모든 것을 배열에 저장하여 함수에 전달합니다.콘솔에서는 다음과 같이 표시됩니다.
RowDataPacket {user_id: 101, ActionsPerformed: 20}
RowDataPacket {user_id: 102, ActionsPerformed: 110}
RowDataPacket {user_id: 104, ActionsPerformed: 3}
쿼리 구조는 다음과 같습니다.
var ret = [];
conn.query(SQLquery, function(err, rows, fields) {
if (err)
alert("...");
else {
for (var i of rows)
ret.push(i);
}
doStuffwithTheResult(ret);
}
에서 이 정보를 가져오려면doStuffwithTheResult
기능하고 있습니까?값이 더 중요하지만 열쇠도 구할 수 있으면 좋겠습니다.
알고 보니 그것들은 정상적인 물체이며user_id
.
RowDataPacket은 실제로 객체를 만드는 컨스트럭터 함수의 이름으로 다음과 같습니다.new RowDataPacket(user_id, ...)
. 그 이름에 접속하여 확인할 수 있습니다.[0].constructor.name
결과가 어레이인 경우,[0].user_id
.
와 함께Object.prototype
접근,JSON.parse(JSON.stringify(rows))
오브젝트를 반환하고 값을 추출합니다.Object.values()
const result = Object.values(JSON.parse(JSON.stringify(rows)));
사용방법:
result.forEach((v) => console.log(v));
최근에도 복잡한 질의에 대해 급행 프로젝트에서 워터라인을 사용할 때 SQL 문을 사용하여 질의합니다.
이것이 저의 해결책입니다.먼저 반환값(RowDataPacket 객체)을 문자열로 변환한 후 이 문자열을 json 객체로 변환합니다.
다음은 코드입니다.
//select all user (查询全部用户)
find: function(req, res, next){
console.log("i am in user find list");
var sql="select * from tb_user";
req.models.tb_user.query(sql,function(err, results) {
console.log('>> results: ', results );
var string=JSON.stringify(results);
console.log('>> string: ', string );
var json = JSON.parse(string);
console.log('>> json: ', json);
console.log('>> user.name: ', json[0].name);
req.list = json;
next();
});
}
다음은 콘솔입니다.
>> results: [ RowDataPacket {
user_id: '2fc48bd0-a62c-11e5-9a32-a31e4e4cd6a5',
name: 'wuwanyu',
psw: '123',
school: 'Northeastern university',
major: 'Communication engineering',
points: '10',
datems: '1450514441486',
createdAt: Sat Dec 19 2015 16:42:31 GMT+0800 (中国标准时间),
updatedAt: Sat Dec 19 2015 16:42:31 GMT+0800 (中国标准时间),
ID: 3,
phone: 2147483647 } ]
>> string: [{"user_id":"2fc48bd0-a62c-11e5-9a32-a31e4e4cd6a5","name":"wuwanyu","psw":"123","school":"Northeastern university","major":"Communication engineering","points":"10","datems":"1450514
441486","createdAt":"2015-12-19T08:42:31.000Z","updatedAt":"2015-12-19T08:42:31.000Z","ID":3,"phone":2147483647}]
>> json: [ { user_id: '2fc48bd0-a62c-11e5-9a32-a31e4e4cd6a5',
name: 'wuwanyu',
psw: '123',
school: 'Northeastern university',
major: 'Communication engineering',
points: '10',
datems: '1450514441486',
createdAt: '2015-12-19T08:42:31.000Z',
updatedAt: '2015-12-19T08:42:31.000Z',
ID: 3,
phone: 2147483647 } ]
>> user.name: wuwanyu
안녕하세요, 이거 100% 작동시켜 보세요.
results=JSON.parse(JSON.stringify(results))
doStuffwithTheResult(results);
Object.assign(target, ...sources)을 사용하여 개체의 열거 가능한 모든 자체 속성을 새 속성에 복사할 수 있습니다.
trivial_object = Object.assign({}, non_trivial_object);
그래서 당신의 시나리오에서는, 이 모든 것을 바꾸는 것으로 충분할 수 있다.
ret.push(i);
로.
ret.push(Object.assign({}, i));
rowdatapacket 없이 JSON을 제공하는 코드를 시험합니다.
var ret = [];
conn.query(SQLquery, function(err, rows, fields) {
if (err)
alert("...");
else {
ret = JSON.stringify(rows);
}
doStuffwithTheResult(ret);
}
잰의 대답에서 벗어나 오브젝트를 얕게 보는 것, 지도 기능을 이용한 또 다른 깔끔한 구현,
이 솔루션의 개요: 모든 행을 반복하고 행을 유효한 js 개체로 복사합니다.
// function will be used on every row returned by the query
const objectifyRawPacket = row => ({...row});
// iterate over all items and convert the raw packet row -> js object
const convertedResponse = results.map(objectifyRawPacket);
어레이 맵 기능을 활용했습니다.어레이 내의 모든 항목을 검토하고 해당 항목을 함수의 입력으로 사용하여 할당하는 어레이에 함수의 출력을 삽입합니다.
objectifyRawPacket 함수에 대한 자세한 내용은 소스 어레이에서 "{RawDataPacket}"을 볼 때마다 호출됩니다.이러한 객체는 일반 객체와 매우 유사하게 작동합니다. 즉, "..."(확산) 연산자는 마침표 뒤에 배열에서 항목을 복사합니다. 기본적으로 항목을 호출되는 객체에 복사합니다.
함수의 확산 연산자 주변의 패런은 화살표 함수에서 개체를 암시적으로 반환하기 위해 필요합니다.
솔루션
하다, 하다, 하다, 하다.JSON.stringify(results)
여러 쿼리에서 특정 RowDataPacket 개체를 검색해야 하는 사용자는 다음과 같습니다.
시작하기 전에
중요: 반드시 유효하게 해 주세요.multipleStatements
mysql로 하다
// Connection to MySQL
var db = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '123',
database: 'TEST',
multipleStatements: true
});
다중 쿼리
여러 개의 쿼리를 실행한다고 가정합니다.
// All Queries are here
const lastCheckedQuery = `
-- Query 1
SELECT * FROM table1
;
-- Query 2
SELECT * FROM table2;
`
;
// Run the query
db.query(lastCheckedQuery, (error, result) => {
if(error) {
// Show error
return res.status(500).send("Unexpected database error");
}
우리가 약 if if if if if if if ifconsole.log(result)
을 사용하다
[
[
RowDataPacket {
id: 1,
ColumnFromTable1: 'a',
}
],
[
RowDataPacket {
id: 1,
ColumnFromTable2: 'b',
}
]
]
두 결과 모두 두 테이블에 대해 나타납니다.
기본 Javascript 어레이는 다음과 같습니다.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
이이 from from에서 table1
컬럼은 "" " " " 입니다.ColumnFromTable1
는 한다
result[0][0].ColumnFromTable1 // Notice the double [0]
이라고 할 수 있습니다.a
.
쉬운 방법을 찾았다.
Object.prototype.parseSqlResult = function () {
return JSON.parse(JSON.stringify(this[0]))
}
db 레이어에서는 다음과 같이 해석합니다.
let users= await util.knex.raw('select * from user')
return users.parseSqlResult()
그러면 요소가 일반 JSON 배열로 반환됩니다.
db.query('select * from login',(err, results, fields)=>{
if(err){
console.log('error in fetching data')
}
var string=JSON.stringify(results);
console.log(string);
var json = JSON.parse(string);
// to get one value here is the option
console.log(json[0].name);
})
conn.query(sql, (err,res,fields) => {
let rawData = res;
let dataNormalized = {...rawData[0]};
})
//개체 파괴 중
도움이 됐으면 좋겠는데
오브젝트를 복사하는 가장 간단한 방법이라고 생각합니다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
간단한 방법:
.then( resp=> {
let resultFromDb= Object.values(resp)[0]
console.log(resultFromDb)
}
이 예에서는 응답으로 오브젝트를 받았습니다.Object.values를 사용하면 속성 값이 응답으로 표시되지만, 속성 값이 어레이 안에 들어가 [0]을 사용하여 이 어레이의 첫 번째 인덱스에 액세스하므로 필요한 장소에서 속성을 사용할 수 있습니다.
저장 프로시저에서 반환된 값을 소비하려고 할 때 이 문제가 발생했습니다.
console.log(result[0]);
출력합니다.( RowDataPacket { datetime : '2019-11-15 16:37:05 } } ) 。
나는 그것을 발견했다.
console.log(results[0][0].datetime);
내가 원하는 가치를 줬어
뭐 하냐면 내 .CALL ps_get_roles();
네, 불쾌한 .떤떤 게? ???
[
[
RowDataPacket {
id: 1,
role: 'Admin',
created_at: '2019-12-19 16:03:46'
},
RowDataPacket {
id: 2,
role: 'Recruiter',
created_at: '2019-12-19 16:03:46'
},
RowDataPacket {
id: 3,
role: 'Regular',
created_at: '2019-12-19 16:03:46'
}
],
OkPacket {
fieldCount: 0,
affectedRows: 0,
insertId: 0,
serverStatus: 35,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0
}
]
다음과 같은 배열입니다.
rows[0] = [
RowDataPacket {/* them table rows*/ },
RowDataPacket { },
RowDataPacket { }
];
rows[1] = OkPacket {
/* them props */
}
만약 가 ★★★★★★★★★★★★★★★★★★★★★★★★★★★.http response
을 붙이다[0]
의 수: " " " of언 of of of of: " : " 。
[
{"id":1,"role":"Admin","created_at":"2019-12-19 16:03:46"},
{"id":2,"role":"Recruiter","created_at":"2019-12-19 16:03:46"},
{"id":3,"role":"Regular","created_at":"2019-12-19 16:03:46"}
]
그리고 나는 아무것도 하지 않아도 되었다.
rows[0].map(row => {
return console.log("row: ", {...row});
});
출력은 다음과 같습니다.
row: { id: 1, role: 'Admin', created_at: '2019-12-19 16:03:46' }
row: { id: 2, role: 'Recruiter', created_at: '2019-12-19 16:03:46' }
row: { id: 3, role: 'Regular', created_at: '2019-12-19 16:03:46' }
그래서 다들 아무 이유 없이 발을 헛디뎌요.또는 일반 쿼리가 아닌 스토어 프로시저를 실행하고 있는 경우에도 쿼리와 SP의 응답이 다를 수 있습니다.
저도 같은 문제가 있었는데, 해결 방법은 다음과 같습니다.
const results = pool.query('sql sentence',[params]);
console.log((results[0])[0].name);
언급URL : https://stackoverflow.com/questions/31221980/how-to-access-a-rowdatapacket-object
'programing' 카테고리의 다른 글
JavaScript에서 URL을 인코딩하시겠습니까? (0) | 2022.10.19 |
---|---|
캡슐화된 익명 함수 구문 설명 (0) | 2022.10.19 |
왜 MariaDB의 CHECK 문은 Linux가 아닌 Windows에서 작동합니까? (0) | 2022.10.19 |
GCC 플러그인에 내장 함수를 추가하는 방법 (0) | 2022.10.19 |
Eclipse: 어설션 활성화 (0) | 2022.10.19 |