mysql - query - rowdatapacket ejs
Cómo acceder a un objeto RowDataPacket (7)
Con el enfoque de Object.prototype
, JSON.parse(JSON.stringify(rows))
devuelve el objeto, extrae los valores con Object.values()
var resultArray = Object.values(JSON.parse(JSON.stringify(rows)))
Uso:
resultArray.forEach(function(v){ console.log(v) })
Actualmente estoy desarrollando una aplicación de escritorio con Node-webkit. Durante ese proceso, necesito obtener algunos datos de una base de datos MySQL local.
La consulta funciona bien, pero no puedo averiguar cómo acceder a los resultados. Los almaceno todos en una matriz que luego se pasa a una función. En la consola se ven así:
RowDataPacket {user_id: 101, ActionsPerformed: 20}
RowDataPacket {user_id: 102, ActionsPerformed: 110}
RowDataPacket {user_id: 104, ActionsPerformed: 3}
Y aquí está la estructura de consulta:
var ret = [];
conn.query(SQLquery, function(err, rows, fields) {
if (err)
alert("...");
else {
for (var i of rows)
ret.push(i);
}
doStuffwithTheResult(ret);
}
¿Cómo recupero esto en la función doStuffwithTheResult
? Los valores son más importantes, pero si pudiera obtener las claves también sería genial.
Encontré una manera fácil
Object.prototype.parseSqlResult = function () {
return JSON.parse(JSON.stringify(this[0]))
}
En la capa db hacer el análisis como
let users= await util.knex.raw(''select * from user'')
return users.parseSqlResult()
Esto devolverá elementos como una matriz JSON normal.
Puede copiar todas las propiedades propias enumerables de un objeto a una nueva mediante Object.assign (destino, ... fuentes) :
trivial_object = Object.assign({}, non_trivial_object);
así que en tu escenario, debería ser suficiente para cambiar
ret.push(i);
a
ret.push(Object.assign({}, i));
Resulta que son objetos normales y puedes acceder a ellos a través de user_id
.
Si el resultado es una matriz, tendría que usar [0].user_id
.
También encontré el mismo problema recientemente, cuando uso la línea de flotación en un proyecto Express para consultas complejas, use la instrucción SQL para consultar.
esta es mi solución: primero transforme el valor de retorno (objeto RowDataPacket) en una cadena y luego convierta esta cadena en el objeto json.
El siguiente es el código:
//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();
});
}
La siguiente es la consola:
>> 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
dejando de lado la respuesta de jan de copiar el objeto de forma superficial, otra implementación limpia utilizando la función de mapa,
Alto nivel de lo que hace esta solución: iterar a través de todas las filas y copiar las filas como objetos js válidos.
// 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);
Aprovechamos la función de mapa de matriz: repasará cada elemento de la matriz, usará el elemento como entrada para la función e insertará la salida de la función en la matriz que está asignando.
más específicamente en la función objectifyRawPacket: cada vez que se llama se ve el "{RawDataPacket}" de la matriz de origen. Estos objetos se parecen mucho a los objetos normales: el operador "..." (propagación) copia los elementos de la matriz después de los períodos, esencialmente copiando los elementos en el objeto al que se llama.
Los parámetros alrededor del operador de propagación en la función son necesarios para devolver implícitamente un objeto desde una función de flecha.
prueba el código que da JSON sin rowdatapacket:
var ret = [];
conn.query(SQLquery, function(err, rows, fields) {
if (err)
alert("...");
else {
ret = JSON.stringify(rows);
}
doStuffwithTheResult(ret);
}