2016-12-30 21 views
0

我似乎无法从一个连接向数据库发出多个请求。它总是告诉我,请求只能从登录状态进行。每个连接请求节点JS和SQL?

例如,如下面的代码所示:该功能的getCarIdandOwner部分将触发罚款。但是getChargeRate不会。

我想他们像这样结合:

connection.execSqlBatch(getcarIdandOwner, getChargeRate);

但是这并没有工作,要么因为它告诉我,getChargeRate没有定义。

使用Visual Studio社区,安装了NPM:Underscore和Tedious(for sql)。只需将其作为控制台应用程序运行即可进行测试。

var Connection = require('tedious').Connection; 
var config = { 
    userName: 'user', 
    password: 'passs', 
    server: 'somewhere.database.windows.net', 
    options: { 
     encrypt: true, 
     database: 'db-Test', 
     useColumnNames: true 
var connection = new Connection(config); 

connection.on('connect', function (err) { 
    // If no error, then good to proceed. 
    console.log("Connected".green); 
    toll("******-b77c-40e0-8f26-d44e98bc7264", "be45c903-****-****-b6ba-4b2fefa3d6b0"); 
}); 

function toll(chipId, locId) { 
    var carId = ''; 
    var userOwner = ''; 
    var charge = ''; 
    var userBalance = ''; 

    getcarIdandOwner = new Request(`SELECT car_id, userOwner FROM Cars WHERE carChipId = '${chipId}'`, function (err) { 
     if (err) { 
      console.log(err); 
     } 
    }); 

    getcarIdandOwner.on('row', function (columns) { 
     carId = columns.car_id.value; 
     userOwner = columns.userOwner.value; 
     console.log('carId: ', carId, ' userOwner: ', userOwner); 
    }); 
    getcarIdandOwner.on('done', function (rowCount, more) { 
     console.log(rowCount + ' rows returned'); 
     if (rowCount = 1) { 
      console.log('Car Rows Returned Ok'.green); 
     } else { 
      console.log('Fatal Error: More than 1 Car Row Returned'.red); 
     }; 
    }); 
    connection.execSqlBatch(getcarIdandOwner); 

    getChargeRate = new Request(`SELECT Charge FROM locations WHERE location_id = '${locId}'`, function (err) { 
     if (err) { 
      console.log(err); 
     } 
    }); 
    getChargeRate.on('row', function (columns) { 
     charge = columns.charge.value; 
     console.log('Charging account: ', userOwner, '$', charge); 
    }); 

    connection.execSqlBatch(getChargeRate); 
} 

回答

1

有一个在http://tediousjs.github.io/tedious/api-connection.html一些文档的规定:

在一个时间只有一个请求可以在连接上被执行。一旦发起了一个 请求(使用callProcedure,execSql或 execSqlBatch),另一个请求将不会被启动,直到请求的 完成回调被调用。

所以,你的代码应该是成才是这样的:

function toll(chipId, locId) { 
    var carId = ''; 
    var userOwner = ''; 
    var charge = ''; 
    var userBalance = ''; 

    getcarIdandOwner = new Request(`SELECT car_id, userOwner FROM Cars WHERE carChipId = '${chipId}'`, function (err) { 
     if (err) { 
      console.log(err); 
     } else { 
      getChargeRate = new Request(`SELECT Charge FROM locations WHERE location_id = '${locId}'`, function (err) { 
       if (err) { 
        console.log(err); 
       } 
      }); 
      getChargeRate.on('row', function (columns) { 
       charge = columns.charge.value; 
       console.log('Charging account: ', userOwner, '$', charge); 
      }); 
      connection.execSql(getChargeRate); 
     } 
    }); 

    getcarIdandOwner.on('row', function (columns) { 
     carId = columns.car_id.value; 
     userOwner = columns.userOwner.value; 
     console.log('carId: ', carId, ' userOwner: ', userOwner); 
    }); 
    getcarIdandOwner.on('done', function (rowCount, more) { 
     console.log(rowCount + ' rows returned'); 
     if (rowCount = 1) { 
      console.log('Car Rows Returned Ok'.green); 
     } else { 
      console.log('Fatal Error: More than 1 Car Row Returned'.red); 
     }; 
    }); 
    connection.execSqlBatch(getcarIdandOwner); 

} 
+0

请问。对(“做”是完成回调还是仅仅当请求返回(理想),而在一个错误'if else' – user3784444

+0

好的,谢谢了!我会测试它tmr – user3784444

+0

它应该在Request的完成回调中:'new Request('sql',function(err,rowCount){// here ...}' 。顺便说一句,你也可以将'Event:done'部分中的代码移动到这个回调函数。 –