节点JS&每个连接请求SQL?

时间:2016-12-30 17:03:35

标签: javascript sql node.js azure azure-sql-database

我似乎无法从一个连接到数据库发出多个请求。它总是告诉我只能从登录状态发出请求。

例如,如下面的代码所示:函数的getCarIdandOwner部分将会正常运行。但是getChargeRate不会。

我尝试将它们组合起来:

connection.execSqlBatch(getcarIdandOwner, getChargeRate);

然而,这不起作用,因为它告诉我getChargeRate没有定义。

使用Visual Studio社区,安装NPM:Underscore和Tedious(用于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 个答案:

答案 0 :(得分:1)

http://tediousjs.github.io/tedious/api-connection.html处有一些文件说明:

  

一次只能在连接上执行一个请求。一旦   请求已启动(使用callProcedure,execSql或   execSqlBatch),另一个不应该在Request之前启动   调用完成回调。

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

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);

}