web-dev-qa-db-de.com

Zugriff auf ein RowDataPacket-Objekt

Ich entwickle derzeit eine Desktop-Anwendung mit Node-Webkit. Während dieses Vorgangs muss ich einige Daten aus einer lokalen MySQL-Datenbank abrufen.

Die Abfrage funktioniert gut, aber ich kann nicht herausfinden, wie man auf die Ergebnisse zugreift. Ich speichere alle in einem Array, das dann an eine Funktion übergeben wird. In der Konsole sehen sie so aus:

RowDataPacket {user_id: 101, ActionsPerformed: 20}
RowDataPacket {user_id: 102, ActionsPerformed: 110}
RowDataPacket {user_id: 104, ActionsPerformed: 3}

Und hier ist die Abfragestruktur:

var ret = [];
conn.query(SQLquery, function(err, rows, fields) {
    if (err)
        alert("...");
    else {
        for (var i of rows) 
            ret.Push(i);
    }
    doStuffwithTheResult(ret);
}

Wie rufe ich dies in der Funktion doStuffwithTheResult ab? Die Werte sind wichtiger, aber wenn ich auch die Schlüssel bekommen könnte, wäre das großartig. 

34
paK0

Es stellt sich heraus, dass es sich um normale Objekte handelt und Sie können über user_id darauf zugreifen.

Wenn das Ergebnis ein Array ist, müssen Sie [0].user_id verwenden.

61
paK0

Ich habe auch das gleiche Problem vor kurzem getroffen, wenn ich für komplexe Abfragen die Wasserlinie in einem Express-Projekt verwende, verwende die SQL-Anweisung zum Abfragen.

dies ist meine Lösung: zuerst den Rückgabewert (RowDataPacket-Objekt) in einen String umwandeln und diesen String dann in das Json-Objekt umwandeln.

Der folgende Code ist:

//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();
    });
}

Folgendes ist Konsole:

    >> 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
18
user5545457

Sie können alle aufzählbaren eigenen Eigenschaften eines Objekts mit Object.assign (target, ... sources) in ein neues kopieren.

trivial_object = Object.assign({}, non_trivial_object);

in Ihrem Szenario sollte es also ausreichend sein, sich zu ändern

ret.Push(i);

zu

ret.Push(Object.assign({}, i));
6
Jan Šourek

Bei Object.prototype-Ansatz gibt JSON.parse(JSON.stringify(rows)) das Objekt zurück, extrahieren Sie die Werte mit Object.values().

var resultArray = Object.values(JSON.parse(JSON.stringify(rows)))

Verwendungszweck:

resultArray.forEach(function(v){ console.log(v) })
4
FranSanchis

sie versuchen den Code, der JSON ohne rowdatapacket gibt:

var ret = [];
conn.query(SQLquery, function(err, rows, fields) {
    if (err)
        alert("...");
    else {
        ret = JSON.stringify(rows);
    }
    doStuffwithTheResult(ret);
}
2

Ich habe einen einfachen Weg gefunden

Object.prototype.parseSqlResult = function () {
    return JSON.parse(JSON.stringify(this[0]))
}

Bei der db-Schicht das Parsing als

let users= await util.knex.raw('select * from user')
    return users.parseSqlResult()

Dadurch werden Elemente als normales JSON-Array zurückgegeben.

1
M14

jans Antwort von flachem Kopieren des Objekts, eine weitere saubere Implementierung mit Map-Funktion,

Hohe Stufe der Funktionsweise dieser Lösung: Durchlaufen Sie alle Zeilen und kopieren Sie die Zeilen als gültige Js-Objekte. 

// 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);

Wir haben die Array-Map-Funktion genutzt: Sie wird jedes Element im Array durchgehen, das Element als Eingabe für die Funktion verwenden und die Ausgabe der Funktion in das Array einfügen, das Sie zuweisen. 

genauer gesagt für die objectifyRawPacket-Funktion: Jedes Mal, wenn sie aufgerufen wird, wird "{RawDataPacket}" aus dem Quellarray angezeigt. Diese Objekte verhalten sich ähnlich wie normale Objekte - der Operator "..." (Spread) kopiert Elemente aus den Arrays nach den Perioden. Im Wesentlichen werden die Objekte in das Objekt kopiert, in dem sie aufgerufen werden. 

Die Parens um den Spread-Operator der Funktion sind notwendig, um ein Objekt implizit von einer Pfeilfunktion zurückzugeben.

0
Julian

Einfacher Weg:

.then( resultFromDb => {
  let resultFromDb = Object.values(resp)[0]
  console.log(resultFromDb)
}

In meinem Beispiel habe ich als Antwort ein Objekt erhalten. Wenn ich Object.values ​​verwende, habe ich den Wert der Eigenschaft als Antwort, jedoch kommt er in ein Array, indem ich mit [0] auf den ersten Index dieses Arrays zugreife. Jetzt habe ich den Wert, um ihn dort zu verwenden, wo ich ihn brauche.

0
capaocapao