如何从node.js中导出(通过" require")模块中的函数返回值?

时间:2015-09-21 17:51:55

标签: javascript mysql node.js asynchronous require

我有一个将由多个应用程序使用的通用模块。该模块有一个具有多种方法的对象。我通过require语句导入对象,但是我在理解如何在异步编程模型中获取返回值时遇到问题。让我在下面的过度简化的伪代码中阐明它:

文件common_module.js:

var mysql = require('mysql');
exports.f1 = function() {
 var connection_pool = mysql.createPool({host: 'xxx', user:..});
 connection_pool.getConnection(function(err, connection) {
    connection.query('SELECT c1 from t1 where c2 =  ?', value, function(err, rows)  {
                     value_to_return  = rows[0].content; //string type
    });
 });
 return (value_to_return);
}

主应用程序是,例如,main.js:

db_getval = require('./common_module.js');
console.log(db_getval.f1());

它总是会抱怨value_to_return是未定义的,因为执行return语句而不等待查询完成(感谢异步编程模型)。虽然这是一个与mysql查询相关的问题,但对于许多其他场景也是如此。我该如何解决这个问题?我错过了一些基本的东西......

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以使用promises或回调。

节点中的回调是处理此类工作的事实上的方式:

var mysql = require('mysql');
exports.f1 = function (cb) {
    var connection_pool = mysql.createPool({
        host: 'xxx',
        user: ..
    });
    connection_pool.getConnection(function (err, connection) {
        if (err) {
            return cb(err);
        }
        connection.query('SELECT c1 from t1 where c2 =  ?', value, function (err, rows) {
            if (err) {
                return cb(err);
            }
            cb(null, rows[0].content);
        });
    });
};

// usage...
theModule(function (err, result) {
    console.log(err, result);
});

也就是说,随着节点0.12中的承诺的引入,由于更强大的错误处理,承诺变得越来越流行。 (链接也非常有用)

var mysql = require('mysql');
exports.f1 = function (cb) {
    return new Promise(function (resolve) {
        var connection_pool = mysql.createPool({
            host: 'xxx',
            user: ..
        });
        connection_pool.getConnection(function (err, connection) {
            if (err) {
                throw err;
            }
            connection.query('SELECT c1 from t1 where c2 =  ?', value, function (err, rows) {
                if (err) {
                    throw err;
                }
                resolve(rows[0].content);
            });
        });
    });
};

// usage...

theModule().then(function (result) {
    console.log(result);
}).catch(function (err) {
    console.log(err, err.stack);
});