0

我对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直到获得查询结果或以其他方式重组我的代码的任何建议?

提前致谢。

4

3 回答 3

2

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

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

另外,请注意 SQL 注入。

于 2013-03-12T04:04:55.553 回答
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");
            }
            ....
        }
于 2013-12-06T14:37:30.680 回答
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");
        }

方法是在尼克说的所有查询都完成后触发一个函数......

于 2013-03-12T05:08:31.740 回答