【问题标题】:How to callback function from another file in nodejs?如何从nodejs中的另一个文件回调函数?
【发布时间】:2013-05-08 21:09:31
【问题描述】:

我开始使用异步编程,我正在制作一个 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?

【问题讨论】:

    标签: javascript node.js asynchronous callback


    【解决方案1】:

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

    【讨论】:

    • ..这就是我所说的...我现在就试试 tnx,,,
    • 我在“callback(rows[0].username)”的 DAO 行中收到错误“未定义不是函数”
    • 您在 ctlUser.js 中的 getUserName 函数的 console.log 行中缺少引号。我修复并测试了。它现在对我有用。
    【解决方案2】:

    它们是未定义的,因为您还没有导出任何东西。

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

    what-is-require

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

    exports.getUserName = getUserName;
    

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

    exports.executeQuery = executeQuery;
    

    【讨论】:

      猜你喜欢
      • 2020-04-25
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      相关资源
      最近更新 更多