0

私はnodejsにかなり慣れていません。

私のコードでデータベースに何度もクエリを実行し、1つの変数ですべてのクエリからデータを収集し、それをどこかで使用するようにしたいのです。

しかし、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モジュールを見て、すべてが実行された後に指定されたコールバックを実行できます (トランザクションを実行することもできます)。

別の (ハック) アプローチは、実行中のクエリ数のカウンターを設定することです。各トランザクションのコールバックで、結果を戻りオブジェクトに保存し、カウンターをデクリメントします。<= 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 に答える