【问题标题】:Node JS & SQL on request per connection?每个连接请求节点 JS 和 SQL?
【发布时间】:2016-12-31 12:26:56
【问题描述】:

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

例如如下代码所示:函数的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);
}

【问题讨论】:

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


    【解决方案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);
    
    }
    

    【讨论】:

    • .on('done' 会是完成回调吗?还是只是在请求返回时(理想情况下)if else没有错误
    • 应该在Request的完成回调中:new Request('sql', function (err, rowCount) {//here...}。顺便说一句,您也可以将Event: done 部分中的代码移动到此回调函数中。
    • 嘿,我对一些代码有一些疑问,无论如何我可以直接与您联系,因为您似乎知识渊博
    • 您好,您最好在 Stackoverflow 上发布新问题,那里拥有庞大的开发者社区,他们或许能够回答您的问题或提供建议。
    猜你喜欢
    • 2017-03-13
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多