0

我开始使用异步编程,我正在制作一个 nodejs 应用程序,我已经在一些文件中切片了代码:index.js、ctlUser.js、DAO.js 等...... Index.js 是它需要的主文件ctlUser 和 ctlUser 需要 DAO.js... DAO 连接到数据库并执行查询...

抽象一下,我的结构是这样的……

索引.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

我抽象了所有模块导出,所有的模块导出都可以很好地使用固定变量,但是数据库响应不......如何在这个结构中实现回调以将用户名带到 index.js?

4

2 回答 2

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);
        });
    };

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

    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);
});
于 2013-05-14T14:28:38.480 回答
-1

它们是未定义的,因为您没有导出任何内容。

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

需要什么

在 ctlUser.js 中,您需要像这样导出 getUserName :-

exports.getUserName = getUserName;

在 DAO.js 中,您需要像这样导出 executeQuery :-

exports.executeQuery = executeQuery;
于 2013-05-14T14:24:53.327 回答