Comment accéder à un objet RowDataPacket
je développe actuellement une application de bureau avec Node-webkit. Au cours de ce processus, j'ai besoin d'obtenir des données à partir D'une base de données MySQL locale.
l'interrogation fonctionne bien, mais je n'arrive pas à trouver comment accéder aux résultats. Je stocke tout dans un tableau, qui est ensuite transmise à une fonction. Dans la console, ils ressemblent à ceci:
RowDataPacket {user_id: 101, ActionsPerformed: 20}
RowDataPacket {user_id: 102, ActionsPerformed: 110}
RowDataPacket {user_id: 104, ActionsPerformed: 3}
et voici la structure de requête:
var ret = [];
conn.query(SQLquery, function(err, rows, fields) {
if (err)
alert("...");
else {
for (var i of rows)
ret.push(i);
}
doStuffwithTheResult(ret);
}
Comment puis-je récupérer ceci dans le doStuffwithTheResult
fonction? Les valeurs sont plus important, mais si je pouvais obtenir les clés, ce serait génial.
7 réponses
Si le résultat est un tableau, vous devez utiliser [0].user_id
.
j'ai également rencontré le même problème récemment, lorsque j'utilise waterline dans express project pour les requêtes complexes ,utiliser la déclaration SQL pour la requête.
c'est ma solution: d'abord transformer la valeur de retour(objet RowDataPacket) en chaîne, puis convertir cette chaîne en objet json.
voici le code :
//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 suite est de la console:
>> 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
vous pouvez copier toutes les propriétés propres d'un objet vers un nouveau par Objet.attribuer(cible, ...les sources):
trivial_object = Object.assign({}, non_trivial_object);
alors dans votre scénario, il devrait suffire de changer
ret.push(i);
ret.push(Object.assign({}, i));
vous essayez le code qui donne JSON sans rowdatapacket:
var ret = [];
conn.query(SQLquery, function(err, rows, fields) {
if (err)
alert("...");
else {
ret = JSON.stringify(rows);
}
doStuffwithTheResult(ret);
}
j'ai trouvé un moyen facile
Object.prototype.parseSqlResult = function () {
return JSON.parse(JSON.stringify(this[0]))
}
à la couche db faites le parsing comme
let users= await util.knex.raw('select * from user')
return users.parseSqlResult()
ceci renvoie des éléments comme le tableau JSON normal.
Object.prototype
approche, JSON.parse(JSON.stringify(rows))
retourne l'objet, extrait les valeurs avec Object.values()
var resultArray = Object.values(JSON.parse(JSON.stringify(rows)))
Utilisation:
resultArray.forEach(function(v){ console.log(v) })
aller hors de jan de réponse faible-de la copie de l'objet, un autre chiffon propre mise en œuvre à l'aide de la carte de fonction,
haut niveau de ce que fait cette solution: itérez toutes les lignes et copiez les lignes comme des objets js valides.
// 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);
nous avons mis à profit la fonction de table de tableau: elle va passer en revue chaque élément du tableau, utiliser l'élément comme entrée dans la fonction, et insérer la sortie de la fonction dans le tableau que vous assignez.
plus spécifiquement sur le fonction objectifyRawPacket: chaque fois qu'on l'appelle, elle voit le "{ RawDataPacket }" du tableau source. Ces objets agissent comme des objets classiques - le "..."(spread) l'opérateur copie les éléments du tableau après les périodes - essentiellement en copiant les éléments dans l'objet dans lequel il est appelé.
les parens autour de l'opérateur spread sur la fonction sont nécessaires pour retourner implicitement un objet d'une fonction de flèche.