如何在节点js中使用require文件返回值?

时间:2014-11-16 12:59:23

标签: node.js require

我是node.js的新手,并使用ari客户端。 我有两个.js文件,第二个需要第一个。我在第二个文件中声明了一个变量,它必须包含第一个文件的返回值,但是console.log(变量)是未定义的,尽管在第一个文件中返回值不为null。

在第一个文件中:

var db = require("./database.js");
var service_info = db.select(connection,'select * from services where ivr_shortcode = ?',service);
console.log(service_info);

service_info未定义;

在第二个文件中:

this.select = function (connection,query,data){
connection.query(query,[data],function(err, results){
    if(err)
    {
        throw err;
    }
    else
    {
        return results;
    }
});}

3 个答案:

答案 0 :(得分:2)

由于调用是异步的,你不能只从回调中返回值,你应该使用另一个函数来获得结果:

// file 'database.js'
exports.select = function (connection, query, data, callback) {
    connection.query(query, [data], callback);
}

比你的主要:

// I assume `connection` and `service` are defined somewhere before (like in your original code)
var db = require("./database.js");
var service_info = db.select(connection,'select * from services where ivr_shortcode = ?',service, function(err, service_info){
  console.log(service_info);
});

P.S。 您应该阅读一些文档并查看Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference以更好地了解范围可见性和闭包

答案 1 :(得分:0)

要处理这种情况,您需要使用async / await来实现它。

exports.select = async function (connection,query,data){
await connection.query(query,[data],function(err, results){
    if(err){
        throw err;
    }else{
        return 
    }
  });
}

这将一直等到您得到结果。因此,永远不会出现不确定的情况。

答案 2 :(得分:-1)

你必须导出select。 像这样的东西:

exports.select = function (connection,query,data){
connection.query(query,[data],function(err, results){
    if(err)
    {
        throw err;
    }
    else
    {
        return 
    }
});}