Nodejs模块导出,等待功能完成

时间:2019-01-04 15:32:30

标签: node.js

我正在使用Node js开发一个应用程序 在我的export_db.js中,我在其中导出连接和查询功能

当我调用该函数时,在export_db内,输出实际上是一个填充了信息的字符串,但是在我的main.js中,输出是未定义的,好像该函数尚未完成,并且代码在结果执行之前继续运行进来。

我如何强迫它等待?

文件export_db.js

var con = mysql.createConnection({
....
    });

con.connect(function(err) {if (err) throw err;});

con.CustomQuery = function(SQLQuery){
    ..DO Stuff
    return stringoutput="";
    con.query(SQLQuery, function (err, result,fields) {            
        if (err) throw err;                  
        var arr =  result;          
        //Do Stuff Transform result into a String
        stringoutput=result as string
        });
    return string output;

});

 module.exports = con;    

文件import_db.js

var db = require('../db/export_db_connection');
//DO Stuff
Queryresult = db.CustomQuery(SQLQuery);
bot.reply(Queryresult) // Send the String to the bot to get a response message
//DO Stuffs

1 个答案:

答案 0 :(得分:0)

由于您的代码本质上是异步的(您必须等待它准备就绪)。最好更改您的_db.js以导出一个工厂函数,该工厂函数返回一个promise,该promise将在连接可用时通过连接实例进行解析。

// _db.js

function connect() {
  return new Promise(function (resolve, reject) {
    var con = mysql.createConnection({
      //....
    });
    con.CustomQuery = function (SQLQuery) {
      return new Promise(function(resolve, reject){
            con.query(SQLQuery, function(err, result, fields){
                if(err) return reject(err)

                // var str = convert result to string here
                resolve(str);

            })

        })
    };
    con.connect(function (err) {
      if (err) return reject(err);
      resolve(con)
    });
  })
}
let conn = null;

function getConnection() {
  if (!conn) {
    conn = connect();
  }
  return conn;
}
module.exports = getConnection; 

然后,当您要使用连接时:

var getConnection = require('/path/to/_db.js');

getConnection()
  .then(function (conn) {
    return conn.CustomQuery(sqlQuery)
  }) 
  .then(function(str){
       // Query result is available here
       console.log(str);
   })

您也可以在没有使用回调的承诺的情况下执行此操作

// _db.js

function connect(cb) {
    var con = mysql.createConnection({
      //....
    });
    con.CustomQuery = function (SQLQuery) {
      //..DO Stuff
      // return stringoutput="";
    };
    con.connect(function (err) {
      if (err) return cb(err);
      cb(null, con)
    });
  })
}
let conn = null;

function getConnection(cb) {
  if (!conn) {
    return connect(function(err, con){
           if(err) return cb(err);
           conn = con;
           cb(null, conn);
    });
  }
  cb(null, conn);
}
module.exports = getConnection; 

然后,当您要使用连接时:

var getConnection = require('/path/to/_db.js');

getConnection(function (err, conn) {
    if(err){
        // handle errors
    }
    QueryResult = conn.CustomQuery(SQLQuery);
  })