現在、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
を介してアクセスできます。
結果が配列の場合、[0].user_id
を使用する必要があります。
また、最近、同じ問題に遭遇しました。複雑なクエリのエクスプレスプロジェクトでウォーターラインを使用する場合、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
Object.assign(target、... sources) :により、オブジェクトの列挙可能なすべてのプロパティを新しいプロパティにコピーできます。
trivial_object = Object.assign({}, non_trivial_object);
あなたのシナリオでは、変更するのに十分なはずです
ret.Push(i);
に
ret.Push(Object.assign({}, i));
Object.prototype
アプローチでは、JSON.parse(JSON.stringify(rows))
はオブジェクトを返し、Object.values()
で値を抽出します
var resultArray = Object.values(JSON.parse(JSON.stringify(rows)))
使用法:
resultArray.forEach(function(v){ console.log(v) })
rowdatapacketなしでJSONを提供するコードを試してください:
var ret = [];
conn.query(SQLquery, function(err, rows, fields) {
if (err)
alert("...");
else {
ret = JSON.stringify(rows);
}
doStuffwithTheResult(ret);
}
簡単な方法を見つけました
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配列として要素が返されます。
オブジェクトの浅いコピーのjanの答え、マップ関数を使用した別のクリーンな実装、
このソリューションの高レベル:すべての行を反復処理し、有効な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}"を参照します。これらのオブジェクトは、通常のオブジェクトとよく似ています。「...」(スプレッド)演算子は、ピリオドの後に配列からアイテムをコピーします-基本的に、呼び出されるオブジェクトにアイテムをコピーします。
関数のスプレッド演算子の周りの括弧は、矢印関数からオブジェクトを暗黙的に返すために必要です。
より簡単な方法:
.then( resultFromDb => {
let resultFromDb = Object.values(resp)[0]
console.log(resultFromDb)
}
私の例では、応答としてオブジェクトを受け取りました。 Object.valuesを使用すると、プロパティの値が応答として取得されますが、この配列の最初のインデックスにアクセスする[0]を使用して、配列内に配置されます。