如何阻止nodejs查询结果

时间:2013-03-12 03:51:37

标签: node.js

我是nodejs的新手。

我希望我的代码能够多次查询数据库,从一个变量中的所有查询中收集数据,然后在某处使用它。

但我想nodejs而不是等待查询的结果,执行没有阻塞。 这就是我认为正在发生的事情。对不起,如果我错了。

for (var i = step_min; i < (step_max); i += step) {
    query = 'select count(' + colName + ') as num_count from ' +
        rows[0].tablename + ' where ' + 'dictionaryid=' +
        rows[0].dictionaryid + ' and ' + colName + ' between ' + i +
        ' and ' + (i + step);

    connection.query(query, function(err, rows1, fields) {
        if (err) {
            console.log(err);
            throw err;
        }

        try {
            console.log("$$$$$$$$$$$$$$$ pushed : "+ rows1[0].num_count);
            contents.push(rows1[0].num_count);  
            console.log('contents : '+ contents+'\n');                        

        } catch (e) {
            if (e instanceof SyntaxError) {
                console.log("Syntax Error for input function");
            }
        }

    });

    console.log("##################### " + query + "\n");

    console.log('contents : '+ contents+'\n');
}

关于如何阻止nodejs直到获得查询结果的任何建议,或者重新构建我的代码的方法?

提前致谢。

3 个答案:

答案 0 :(得分:2)

你是正确的,它不会在执行前等待你的查询。您可以查看可用于对查询进行排队的node-mysql-queues模块,并在执行所有模块后执行给定的回调(它还允许您执行事务处理)

另一种(黑客)方法是设置您正在执行的查询数量的计数器。在每个事务的回调中,将结果保存到返回对象中并递减计数器。如果它是&lt; = 0则所有查询都已完成,您可以使用返回对象执行主回调。

另外,请注意SQL注入。

答案 1 :(得分:1)

试试这个: https://github.com/luciotato/waitfor

使用wait.for:

你的代码

for (var i = step_min; i < (step_max); i += step) {
    query = 'select count(' + colName + ') as num_count from ' +
        rows[0].tablename + ' where ' + 'dictionaryid=' +
        rows[0].dictionaryid + ' and ' + colName + ' between ' + i +
        ' and ' + (i + step);

    var rows1 = wait.forMethod(connection,"query",query); //waits until callback
    console.log("$$$$$$$$$$$$$$$ pushed : "+ rows1[0].num_count);
    contents.push(rows1[0].num_count);  
}
console.log("##################### " + query + "\n");
console.log('contents : '+ contents+'\n');

} catch (e) {
            if (e instanceof SyntaxError) {
                console.log("Syntax Error for input function");
            }
            ....
        }

答案 2 :(得分:0)

做下面的事情可能是一种解决方法。

//它只是一个测试代码,无论我想到的是什么,所以我稍后会调整它......

        var contents = [];

        var lock = 0;

        for (var i = step_min; i < (step_max + step); i += step) {
            lock++;
        }

        for (var i = step_min; i < (step_max + step); i += step) {
            query = 'select count(' + colName + ') as num_count from ' + rows[0].tablename + ' where ' + 'dictionaryid=' + rows[0].dictionaryid + ' and ' + colName + ' between ' + i + ' and ' + (i + step);

            connection.query(query, function(err, rows1, fields) {
                if (err) {
                    console.log(err);
                    throw err;
                }

                try {
                    console.log("$$$$$$$$$$$$$$$ pushed : " + rows1[0].num_count);
                    contents.push(rows1[0].num_count);
                    console.log('contents : ' + contents + '\n');

                } catch (e) {
                    if (e instanceof SyntaxError) {
                        console.log("Syntax Error for input function");
                    }
                }

                lock--;

                if (lock == 0) {
                    queryDone();
                }

            });

        }

        function queryDone() {


            console.log("##################### " + query + "\n");

            console.log('contents : ' + contents + '\n');


            var id = obj.exptID + '.' + obj.exptITR + '.' + obj.nodeID + '.' + obj.resourceName + '.' + colName;
            serie = {
                name: colName,
                data: contents,
                id: id
            };



            console.log("--------------------\n " + step_max + "\n" + step_min + "\n------------------------\n");
        }

该方法是在所有查询完成时触发一个函数,如Nick所说......