2013-05-14 54 views
0

我开始使用异步编程,我做了一个nodejs应用程序,我在一些文件中分割了代码:index.js,ctlUser.js,DAO.js等等...... Index.js是主要文件它需要ctlUser和ctlUser需要DAO.js ... DAO连接到数据库和执行查询...如何从nodejs中的其他文件回调函数?

抽象,我的结构是这样的......

Index.js

var ctlUser = require('./ctlUser.js'); 
var username = ctlUser.getUserName('1'); 
console.log("Return from ctlUser" + username); 

ctlUser.js

var DAO = require('./DAO.js'); 
var getUserName = function(id){ 
    var userName = DAO.executeQuery("SELECT username FROM tbUsers WHERE id = " + id); 
    console.log(Return from DAO = userName); 
    return username; 
} 

DAO.js这里是样样精...

var mysql  = require('mysql'); 
var executeQuery = function(query) {  
     var connection = mysql.createConnection({ 
      host  : SERVER, 
      user  : USER, 
      password : PASSWORD, 
      database : DATABASE 
     }); 
     connection.connect(); 
     connection.query(query, function(err, rows, fields) { 
      if (err) throw err; 
      connection.end(); 
      console.log("Here in DAO: " + rows[0].username); 
      return rows[0].username; 
     }); 
    }; 

$ node index.js输出是:

Return of ctlUser: undefined 
Return of DAO: undefined 
Here in DAO: Filipe Tagliacozzi 

林抽象所有模块的出口everithing正常工作与固定变量,但数据库的响应不要..如何在此结构中实现回调以将userName引用到index.js?

回答

8

更改DAO.js模块中的executeQuery函数以使用回调:

var executeQuery = function(query,callback) {  
     var connection = mysql.createConnection({ 
      host  : SERVER, 
      user  : USER, 
      password : PASSWORD, 
      database : DATABASE 
     }); 
     connection.connect(); 
     connection.query(query, function(err, rows, fields) { 
      if (err) throw err; 
      connection.end(); 
      console.log("Here in DAO: " + rows[0].username); 
      callback(rows[0].username); 
     }); 
    }; 

链通过您getUserName函数的回调中ctlUser.js:

var getUserName = function(id,callback){ 
     DAO.executeQuery("SELECT username FROM tbUsers WHERE id = " + id ,function(username){ 
      console.log("Return from DAO =" ,userName); 
      callback(username); 
     });  
    } 

然后使用它在index.js像这样:

var ctlUser = require('./ctlUser.js'); 
ctlUser.getUserName('1',function(username){ 
    console.log("Return from ctlUser" + username); 
}); 
+0

..这是我在谈论什么...我现在尝试tnx ,,, – 2013-05-14 14:30:11

+0

我在 “callback(rows [0] .username)”的DAO行中得到一个错误“未定义不是函数” – 2013-05-14 14:44:37

+0

在getUserNam的console.log行中缺少引号e函数在ctlUser.js中。我修复并测试过。现在它为我工作。 – 2013-05-14 16:27:13

-1

它们未定义,因为您尚未导出任何内容。

节点文件在您需要它们时执行,但返回的内容是导出的内容。

what-is-require

在ctlUser.js需要getUserName导出为这样: -

exports.getUserName = getUserName; 

并在您需要的executeQuery导出为这样DAO.js: -

exports.executeQuery = executeQuery; 
+0

林抽象的所有模块出口..其工作的罚款 – 2013-05-14 14:28:01

相关问题