2016-12-30 22 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'部分中的代碼移動到這個回調函數。 –