0

私は次のことを達成しようとしています(非常に基本的なものであり、些細なことを見逃しているに違いありません):

  1. select ステートメントを含む文字列で関数を呼び出す
  2. DB 呼び出しが完了し、行 (または json に相当するもの) が返されるまで待ちます
  3. http オブジェクトを設定して戻します

コードは次のとおりです。

    util.js
exports.execute = function( query){
    if (connection) {
        connection.query(query, function(err, rows, fields) {
            if (err) throw err;
            console.log("from Util - " + JSON.stringify(rows));
            return JSON.stringify(rows);
        });
    }
};

repo.js
var q =  "select * from xxx";
    var response;
    util.execute(q,  function (err,  r){
            if (err){
                throw err;
                console.log(err);
            }
            else {
                console.log(r);
                res.contentType('application/json');
                res.write(r);
                res.end();
            }
        });

私の問題は、util.js 内のコードが呼び出され、コンソールで json が表示されている間、repo.js の匿名コールバック関数に戻ってこないことです。

ここで何が間違っていますか?

アップデート

ありがとうベン私も同じ行で解決策を見つけました...ここに新しいコードがあります:

repo.js:
var send_data = function (req, res, r){
    res.contentType('application/json');
    res.write(r);
    res.end();

}
exports.all = function(req, res){
    var q =  "select * from XXX";
    var response;
    util.execute(req, res,q,  send_data);
};

util.js:
exports.execute = function(req, res,  query, callback){
    if (connection) {
        connection.query(query, function(err, rows, fields) {
            if (err) throw err;
            callback(req, res, JSON.stringify(rows))  ;
        });
    }
};
4

1 に答える 1

0

util.execute は、コード内で 1 つのパラメーターのみを受け入れます。このように使用するには、2 番目のコールバック パラメータを受け入れる必要があります。(コールバックは魔法ではなく、単なる関数呼び出しです)

何かのようなもの:

exports.execute = function(query,callback){
    if (connection) {
        connection.query(query, function(err, rows, fields) {
            if (err) throw err;
            console.log("from Util - " + JSON.stringify(rows));
            callback(null,JSON.stringify(rows));
        });
    }
};

一貫して動作し、エラー パラメータを受け入れるようにしたい場合は、次のように入力することをお勧めします。

exports.execute = function(query,callback){
    if (connection) {
        connection.query(query, function(err, rows, fields) {
            callback(err,null);
            console.log("from Util - " + JSON.stringify(rows));
            callback(null,JSON.stringify(rows));
        });
    }
};
于 2013-05-21T00:41:09.853 に答える