3

nodejsモジュールでデータベース接続を行っています。しかし、そのコールバックは呼び出されません。

これが私のモジュールです-

* getChapterList.js

var mysql=require('mysql');
var client=mysql.createClient({
    user:'mysql',
    password:''
});
client.useDatabase('test');
module.exports.get_chapter_list = function(subject_id){

    client.query("select distinct chapter_id from course_associations where subject_id="+subject_id+" and status_id=1",
            function(err,results,fields){
                    return results;
    });
  return "hello";
};

今、私はこのモジュールを次のように呼んでいます-

rs=require('./getChapterList');

rs.get_chapter_list(1);

// Output: hello

ただし、期待されるo/pは結果配列です。

グーグルでたくさん。しかし結果はありません。

4

3 に答える 3

3

結果を非同期的に返す必要があります。

exports.get_chapter_list = function(subject_id, callback) {
    client.query("select ...", callback);
};

...

var rs = require('./getChapterList');

rs.get_chapter_list(1, function(err, results) {
    if (err) {
        // handle error
    } else {
        // do something with results
        console.log(results);
    }
});
于 2012-08-21T12:57:22.513 に答える
3

クエリが完了した後にコールバックが呼び出され、結果の戻り値がコールバックを作成したメソッドに返され、メソッドはそれを破棄します。

出力が「hello」である理由は、それがget_chapter_list関数が返すものだからです。

何が起こるか:

  1. get_chapter_list関数を呼び出します
  2. はデータベースへのclient.queryリクエストを開始します
  3. client.query関数が戻ります。
  4. get_chapter_list関数は「こんにちは」を返します。
  5. SQL クエリが完了し、コールバックを呼び出します
  6. コールバック メソッドが呼び出され、何もしません (結果を返すだけですが、その戻り値は、client.queryそれを破棄するコールバック ( 内のどこか) の呼び出し元に返されます)。

欲しいものを手に入れるには、おそらく非同期的に考える必要があります。

メソッドを次のように定義します。

module.exports.get_chapter_list = function(subject_id, callback){
  client.query("select distinct chapter_id from course_associations where subject_id="+subject_id+" and status_id=1",
    function(err,results,fields){
      // doesn't contain any error handling
      callback(results);
  });
};

次に、メソッドを呼び出します。

rs.get_chapter_list(1, function(results) {
   console.log(results); // or whatever you need to do with the results
});
于 2012-08-21T13:01:04.260 に答える
0

私はこの問題に直面し、コールバック関数を引数として渡すだけで解決したので、scttnlsnの答えは正しいです。

そのために試してください:

var mysql=require('mysql');
var client=mysql.createClient({
  user:'mysql',
  password:''
});
client.useDatabase('test');
module.exports.get_chapter_list = function(subject_id, callback){
  client.query("select distinct chapter_id from course_associations where subject_id="+subject_id+" and status_id=1",
        function(err,results,fields){
                callback( results );
});
return "hello";
};

その後

var rs = require('./getChapterList');

rs.get_chapter_list(1, function(results) {
  console.log(results);
}
});

これにより、欲望の出力が出力されます。

于 2012-08-21T14:13:01.333 に答える