Node.js express.js中如何连接两个node-mysql.js函数的结果
我正在尝试使用express和node mysql将mysql数据库中的一些遗留数据导出为JSON。下面的SQL工作正常。我正在努力寻找一种简单的方法来连接getOwnerID的“结果”和comp中返回的每一行的数据 我还使用了async.js,但我不确定这是否有帮助。但是如果我可以不使用这个,那可能会更好Node.js express.js中如何连接两个node-mysql.js函数的结果,node.js,express,node-mysql,Node.js,Express,Node Mysql,我正在尝试使用express和node mysql将mysql数据库中的一些遗留数据导出为JSON。下面的SQL工作正常。我正在努力寻找一种简单的方法来连接getOwnerID的“结果”和comp中返回的每一行的数据 我还使用了async.js,但我不确定这是否有帮助。但是如果我可以不使用这个,那可能会更好 //join some tables to get comprehensive voucher data exports.compVouchers = function(req
//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(results));//仅打印每张凭证的所有所有者id
res.end(JSON.stringify(rows));//打印每个凭证的数据,但不打印所有者id
这并不能解决问题,但正如你所看到的,我已经试着按照这条线索中的建议去做了。这比事实中更美:) 试试这个:
var result={}, c=rows.length;
function getOwnerID(voucher, cb){
connection.query('SELECT ...', function(err, info) {
if(err) console.log(err);
else result[info] = voucher;
if(!--c)return cb();
});
}
while(rows.length){
getOwnerID(rows.pop(), function(){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(JSON.stringify(results));// {"owner1":{voucher1}, "owner2":{voucher2}}
res.end();
})
}
好的,伙计们(谢谢@vp_arth用一个有趣的方向推我,让我接近了,排版结果应该是result btw)
因此,无论如何,我最终得到了一个黑客解决方案,我使用.push underline.js和.replace来帮助我清理JSON数据,以便以后/下一步在nosql数据库(如MongoDB)中使用它
//declare global array variable... there must be a more elegant solution
var compV = [];
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;
// now get each vouchers owner id
console.log("Got "+rows.length+" Vouchers:");
async.each(rows, getOwnerID, function(err, results){
res.writeHead(200, {'Content-Type': 'text/plain'});
// now user underscore.js to clean up JSON
var finalComp = JSON.stringify(un.flatten(un.compact(compV)));
// finally use replace to customise the known output to merging the voucher and owner into single JSON documents
var finalComp2 = finalComp.replace(/},{"owner_id/g,',"owner_id'); //not happy with this but it works
res.write(finalComp2);
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, owner) {
if(err) {
console.log(err);
return callback(err);
}
else {
var arr = [];
arr.push(voucher);
arr.push(owner);
compV.push(arr); //append to global array variable
return callback(null, compV); // doesn't return anything??
}
});
}
也许有一种更优雅的合并方式
[{“F1_字段1”:“F1_值1”,“F1_字段2”:“F1_值2”},{“F2_字段1”:“F2_值2”}]
进入
[{“F1_字段1”:“F1_值1”、“F1_字段2”:“F1_值2”、“F2_字段1”:“F2_值2”}]
这是我的最后一段代码,带有注释/想法
您现在还需要npm将下划线添加到async并在变量中声明它们。。。更不用说节点mysql和express。。。我使用了“un”而不是“\ux”,所以我不会对以后可能看起来像jquery速记的代码感到困惑 我认为您可以更改
返回回调(null,info)代码>到var r={};r[信息]=凭证;返回回调(null,r)代码>。然后在结果变量中得到[{owner\u id1:voucher1},{owner\u id2:voucher2}]
,好的,我会仔细考虑。我还想知道.push是否可以提供一种方法来处理相应的JSO,比如rows.push(results.owner\u id)??我不明白,为什么要将id推送到凭证上。您将获得[v1,v2,…vn,ownID1,ownID2]
。你想要什么?如果您想获得{own_id1:v1,own_id2:v2}
您可以尝试(从上面的结果)var newResult={};对于(var i=0;我已经尝试了几种方法来遵循您的建议。通过使用var r={};r[JSON.stringify(info)]=凭证;返回回调(null,r);
我恐怕无法适应您美化的代码答案,因为node似乎不喜欢“while”子例程嵌套在CompDecreate函数中和/或替代异步回调。此while
带有行。pop
相当于(…)
)的)assync.map也可以使用类似的功能。getOwnerID和connection.query是异步的,我们暂时不会得到一些blocksfunction(rows,next){if(!rows.length)return next();getOID(rows.pop(),function(){…});process.nextTick(function(){awhile(rows,next)}}暂时(rows,function(){/*所有迭代都已开始*/});这不管用。1.res.end(JSON.stringify(results));应该是res.end(JSON.stringify(result));二,。它返回“object”。请看下面的答案。你的代码很难看,对不起。当您收到多个请求时,全局状态会使应用程序崩溃