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.

25
demandé sur ucMedia 2015-07-04 17:53:13

7 réponses

user_id.

Si le résultat est un tableau, vous devez utiliser [0].user_id.

51
répondu paK0 2018-01-23 08:45:21

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
16
répondu user5545457 2015-12-25 06:00:15

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));
5
répondu Jan Šourek 2016-07-25 15:46:51

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);
}
2
répondu Kumaresan Perumal 2015-11-24 05:24:32

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.

0
répondu M14 2017-12-23 11:50:23

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) })
0
répondu FranSanchis 2018-04-29 20:18:57

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.

0
répondu Julian 2018-08-12 05:39:37