在nodejs中使用mysql查询的同步请求

时间:2015-12-16 08:40:44

标签: node.js express nodes

我正在使用express框架处理node.js,我正在尝试调用多个mysql查询,每个查询都依赖于之前的查询。 如何同步执行查询。

function f1(id, cb) {
    $sql = "SELECT * FROM s1 where process_id=" +id;

    connection.query(
        $sql, 
        function (err, result) {         
            if (err) {
                cb(err, null);
            } else {
                var str = '';

                if (result.length > 0) {
                    for(val in result) {
                        $sql = "SELECT attribute_name FROM s2 where id=" + result[val].id;

                        connection.query(
                            $sql, 
                            function (err, attrresult) {         
                                if (err) {
                                    cb(err, null);
                                } else {
                                    if (result.length > 0) {
                                        str  +=  attrresult[0].attribute_name;
                                    }
                                }
                            }
                        );              
                    }
                }

                cb('', str);
            }                
        }
    );
}

router.get('/', function(req, res, next) {  
    f1('27', function (err,respose) {
        console.log(respose);
    });
});

请建议。我们怎么能这样做。

提前致谢。

4 个答案:

答案 0 :(得分:0)

你无法真正实现同步,但你可以通过使用promises和generator来使其看起来像同步代码。

function mySexyMethod() {
    return new Promise(function (resolve, reject) {
        someAsyncethod(params, function (err, data) {
            if (err) {
                return reject(err);
            }

            resolve(data);
        })
    });
}

Express router

var wrap = require('co-express');

router.verb('some-route', wrap(function* (req, res, next) {

    var val, val2;

    try {
        val = yield mySexyMethod();
        val2 = yield anotherPromiseThatRequiresPreviousVal(val);
    } catch (e) {
        return next(e);
    }
});

更好的是,查看https://www.npmjs.com/package/bluebird并检查您使用的mysql lib是否可以被宣传。

答案 1 :(得分:0)

您可以使用promise chaining或async包来逐步处理系列执行 查看以下指南以进行承诺链接 https://coderwall.com/p/ijy61g/promise-chains-with-node-js

用于异步检查以下包 https://github.com/caolan/async

答案 2 :(得分:0)

根据定义,节点I / O是异步的。我认为你的问题是for循环。它在匹配每变量嵌套查询回调之前循环所有迭代。因此,使用某种机制来实现所需的执行流程。你可以使用promises,有几个好的库(Q,Bluebird,ES2015的原生承诺......)你也可以使用async.js更容易处理它。

libs不是强制性的,但它们可以更轻松地完成工作。

答案 3 :(得分:0)

正如大家所说,Async.js是做这种事情的好办法。

然而,一开始可能有点难以处理。如果您想要更多抽象,我建议您使用像Danf这样的框架(基于Express构建)。该框架以原始且简单的方式抽象Async.js来处理异步(以串行,并行,......执行操作)。看看overview,了解我的意思。