Express と node-mysql を使用して、mysql db からレガシー データを JSON としてエクスポートしようとしています。以下の SQL は問題なく動作します。getOwnerID の「結果」と、compVouchers で返される各行のデータを結合する簡単な方法に苦労しています。
また、別のスレッドに従って async.js を使用していますが、これが役に立っているのかどうかはわかりません。しかし、これを使用しないで済ますことができれば、そのほうがよいかもしれません。
//join some tables to get comprehensive voucher data
exports.compVouchers = function(req, res) {
var advertType = '"discount_voucher_all_CANCELLED"';
if (connection) {
connection.query('SELECT V.id AS voucher_id, V.title, V.description, V.discount, V.customers_total, V.advert_type, ' +
'V.customers_redeemed, V.start_date, V.expiry_date, V.redemption_code, ' +
'K.image, G.latitude, G.longitude FROM '+dbname+'.vouchers AS V ' +
'LEFT JOIN '+dbname+'.iag_key_tags AS K ON ( V.id = K.id ) ' +
'LEFT JOIN '+dbname+'.iag_geo_tags AS G ON ( V.id = G.id ) ' +
'WHERE V.advert_type like '+advertType , function(err, rows, fields) {
if (err) throw err;
console.log("Got "+rows.length+" Vouchers:");
// now get each vouchers owner id
async.map(rows, getOwnerID, function(err, results){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(JSON.stringify(results));
res.end();
});
});
}
};
function getOwnerID(voucher, callback) {
connection.query('SELECT parent_tagid AS owner_id FROM '+dbname+'.iag_key_tag_relationships WHERE TYPE =2 AND tagid = '+ voucher.voucher_id, function(err, info) {
if(err) {
console.log(err);
return callback(err);
}
else {
return callback(null, info);
}
});
}
それで
res.end(JSON.stringify(結果)); // 各バウチャーのみのすべての owner_id を出力します
res.end(JSON.stringify(行)); // 各バウチャーのデータを出力しますが、owner_id は出力しません
node-mysql の結果行を node.js の単一の JSON 戻り値に結合しても問題は解決しませんが、ご覧のとおり、そのスレッドの提案に従おうとしました。