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 是结果数组。

google了很多..但没有结果..

4

3 回答 3

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 回答
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 回答
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 回答