【问题标题】:Connect to Azure SQL DB from a Azure Functions in JS从 JS 中的 Azure Functions 连接到 Azure SQL DB
【发布时间】:2018-02-13 18:26:15
【问题描述】:

我正在尝试从用 nodeJS 编写的 azure 函数连接到我的 Azure SQL DB。我已经在应用程序设置中设置了连接字符串,但它仍然不起作用。我使用 ODBC 密钥进行连接设置。有人试过这个吗?下面是我的函数的示例代码

var Connection = require('tedious').Connection;
var Request = require('tedious').Request;

// Create connection to database
const config = process.env["sqldb_connection"];
var connection = new Connection(config);

// Attempt to connect and execute queries if connection goes through
connection.on('connect', function(err)
   {
     if (err)
       {
          console.log(err)
       }
    else
       {
           queryDatabase()
       }
   }
 );

function queryDatabase()
   { console.log('Reading rows from the Table...');

       // Read all rows from table
     request = new Request(
          "SELECT ORG_ID,ORG_NAME FROM org",
             function(err, rowCount, rows)
                {
                    console.log(rowCount + ' row(s) returned');
                    process.exit();
                }
            );

     request.on('row', function(columns) {
        columns.forEach(function(column) {
            console.log("%s\t%s", column.metadata.colName, column.value);
         });
             });
     connection.execSql(request);
   }

我收到一个错误提示

Exception while executing function: Functions.HttpTriggerJS2. mscorlib: The given key was not present in the dictionary.

【问题讨论】:

标签: azure azure-sql-database azure-functions


【解决方案1】:
  1. D:\home\site\wwwroot下的Kudu远程执行控制台中运行npm install tedious命令。

  2. 在 Azure Functions 中,您的所有代码都应放在 module.exports 函数中。

  3. 您应该使用context.log() 而不是console.log()

  4. 您真的不必在函数的应用程序设置中设置连接设置字符串。

  5. 您应该在代码完成时通过调用context.done() 通知运行时。

以下代码适用于我:

var Connection = require('tedious').Connection;
var Request = require('tedious').Request;

module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    var config = {
        userName: '<userName>',
        password: '<password>',
        server: '<AzureSQLDBName>.database.windows.net',

        // If you're on Windows Azure, you will need this:
    options:
        {
                database: 'your DB',
                  encrypt: true
        }
};

    var connection = new Connection(config);

    connection.on('connect', function(err) {

        if (err) {
            context.log(err);

            context.res = {
                status: 500,
                body: "Unable to establish a connection."
            };
            context.done();

        } else {
            executeStatement();
        }
    });

    function executeStatement() {

        request = new Request("select 42, 'hello world'", function(err, rowCount) {
            if (err) {
                context.log(err);

                context.res = {
                    status: 500,
                    body: "Failed to connect to execute statement."
                };
                context.done();

            } else {
                context.log(rowCount + ' rows');
            }
        });

        request.on('row', function(columns) {
            columns.forEach(function(column) {
                context.log(column.value);
            });

            context.done();
        });

        connection.execSql(request);
    }
};

有关详细信息,请参阅Azure Functions JavaScript developer guide

【讨论】:

  • 感谢您的宝贵意见,是的,我按照您的建议进行了更改,并且有效。但是当我更改 SQL 查询以从我的数据库中读取表时,它不起作用。例如,我有一个名为 fruits 的表和一个如下查询 var sqlQuery = "SELECT apples,oranges FROM fruits; request = new Request(sqlQuery, function(err, rowCount, rows) { .... } 当我这样做时,我收到一条错误消息 RequestError: Invalid object name 'fruits'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2023-03-12
  • 2018-05-01
  • 2019-02-02
  • 2016-01-17
相关资源
最近更新 更多