NodeJs中的异步函数

问题描述:

我编写了一个服务器(它应该获取请求并发送响应)和另一台连接到db的服务器(并且具有用于不同查询的一些功能)。NodeJs中的异步函数

该项目具有RoutingPath.Js,它只根据url的路径路由到所需的函数。 ServerLogic.Js初始化数据库服务器,某些功能(根据RoutingPath)和查询功能:

var SqlServer = require("./ConnectToSql"); 
var request = SqlServer.ConnectToSql(); 

if (SqlServer == null) 
{ 
    console.log ("+++++++SqlServer = null"); 
} 
else 
{ 
    console.log ("-------SqlServer" + SqlServer); 
} 

if (request == null) 
{ 
    console.log("!!!!!!!!!"); 
} 
else 
{ 
    console.log("$$$$$$$$$$"+request); 
} 

function Welcome(params) 
{ 
    console.log("ServerLogic: Welcome to My Trip server with: " + params.user + "=" + params.password); 
    var tmp = RunQuery("SELECT GroupName FROM Groups"); 
    console.log("Welcome: " + tmp); 
    //return "Welcome to My Trip server with: " + params.user + "=" + params.password; 
    return tmp; 
} 

function RunQuery(sqlquery) 
{ 
    console.log("---request: " + request + "--------"); 

    request.query(sqlquery, function(err, recordset) { 
     if (err) 
     { 
     console.log(err); 
     console.log("----End Query Error-------"); 
     } 
     else 
     { 
     console.log(recordset); 
     console.log("----End recordset-------"); 
     return recordset; 
     } 
    }); 
} 

exports.Welcome = Welcome; 

而且我有一个连接到数据库ConnectToSql.Js:

var sql = require('C:/Program Files/nodejs/node_modules/mssql'); 

var config = { 
    user: '', 
    password: '', 
    server: '', 
    database: '', 
    } 
}; 

function ConnectToSql() 
{ 
    var connection = new sql.Connection(config, function(err) { 

    if (err) 
    { 
     console.log(err); 
    } 
    else 
    { 
     var request = new sql.Request(connection); 
     console.log("#########" + request); 
     return request; 
    } 
    }); 
} 

exports.ConnectToSql = ConnectToSql; 

这是我的输出:

 
-------SqlServer[object Object] 
!!!!!!!!! 
#########[object Object] 

所以我的问题是输出的顺序: 为什么会出现:“#########的翻译:”没有第二个输出(然后锡尔d输出将是:$$$$$$$$$$ [object Object])

+0

中目前没有您所显示的代码会输出任何东西以'# ########'。它来自哪里? – mscdex 2014-09-28 18:50:16

+0

是的,你是正确的,我修正了它... – user2004403 2014-09-28 19:02:23

原因request == null是因为ConnectToSql()是非阻塞的,并且在连接完成之前立即返回。使用异步代码时,您应该传递回调。例如:

function ConnectToSql(callback) { 
    var connection = new sql.Connection(config, function(err) { 
    if (err) 
     return callback(err); 
    callback(null, connection); 
    }); 
} 

然后在你的主服务器逻辑:

var sql = require('C:/Program Files/nodejs/node_modules/mssql'), 
    SqlServer = require('./ConnectToSql'); 

var connection; 

function Welcome(params, callback) { 
    console.log('ServerLogic: Welcome to My Trip server with: ' + params.user + '=' + params.password); 
    RunQuery('SELECT GroupName FROM Groups', callback); 
} 

function RunQuery(sqlquery, callback) { 
    if (!connection) { 
    SqlServer.ConnectToSql(function(err, conn) { 
     if (err) 
     return callback(err); 
     connection = conn; 
     RunQuery(sqlquery, callback); 
    }); 
    return; 
    } 

    var request = new sql.Request(connection); 
    request.query(sqlquery, callback); 
} 

exports.Welcome = Welcome; 

然后使用Welcome(),如:

Welcome(params, function(err, recordset) { 
    // ... 
}); 
+0

我需要时间来更好地理解它,并且它在ConnectToSql.Js中的ConnectToSql函数的小改动中工作(它返回请求但不是连接,因为我不想要求mssql在2个文件中)和ServerLogic中。谢谢! – user2004403 2014-09-28 22:00:54