Node.js express.js中如何连接两个node-mysql.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

我正在尝试使用express和node mysql将mysql数据库中的一些遗留数据导出为JSON。下面的SQL工作正常。我正在努力寻找一种简单的方法来连接getOwnerID的“结果”和comp中返回的每一行的数据

我还使用了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(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”。请看下面的答案。你的代码很难看,对不起。当您收到多个请求时,全局状态会使应用程序崩溃