【问题标题】:Can't connect Node.js server to Azure SQL Database无法将 Node.js 服务器连接到 Azure SQL 数据库
【发布时间】:2016-09-05 18:49:03
【问题描述】:

我在 Heroku 上运行一个简单的 Node.js 服务器。我已经设置了一个 Azure SQL 数据库,我只是试图从服务器建立到它的连接。我正在使用tedious.js 进行连接。据我所知,我正在遵循文档中的模式,但连接没有通过。这是我拥有的代码(更改的用户名和密码)。现在,从我的浏览器向“/data”页面发出 GET 请求时会调用 connect 函数,但该页面永远不会加载,连接也永远不会通过。有什么指点吗?

var azure = require("azure-storage");

var Connection = require("tedious").Connection;

var config = {
  Server : "cultureofthefewpractice.database.windows",
  username : "XXXXX",
  password : "XXXXX",
  options : {
    port: 1433,
    Database : "cultureofthefewpracticedatabase",
    connectTimeout : 3000,
  },
};


var connection = new Connection(config);

function connect(request, response) {
  connection.on("connect", function(error) {
    //If no error, then good to go
    console.log("Connected to database! Booyah.");
    executeStatement();

    response.send("Connected to database! Booyah.");
  }, function (info) {
    console.log(info);
  });
}

exports.connect = connect;

【问题讨论】:

  • 我知道您故意隐藏了用户名和密码,但是... Server uri 最后缺少 .net。不确定您的真实代码是否也缺少它 - 这将是一个问题。另外:您是否打开了 SQL 数据库防火墙以允许来自您的节点应用程序的传入连接?
  • 代码中缺少 .net - 不知道这是怎么发生的。我补充说。我已经为我的 IP 地址设置了防火墙规则。我应该使用我机器的IP吗?或者我应该从heroku为服务器使用一个单独的IP?
  • 它是您的流量来自什么 IP,进入 SQL 数据库。我也会发布答案。

标签: sql-server node.js azure azure-sql-database tedious


【解决方案1】:

我回应社区提供的答案。这是一个可以帮助您入门的快速代码示例 -

var Connection = require('tedious').Connection;
var config = {
    userName: 'yourusername',
    password: 'yourpassword',
    server: 'yourserver.database.windows.net',
    // When you connect to Azure SQL Database, you need these next options.
    options: {encrypt: true, database: 'AdventureWorks'}
};
var connection = new Connection(config);
connection.on('connect', function(err) {
    // If no error, then good to proceed.
    console.log("Connected");
    executeStatement();
    //executeStatement1();

});

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

function executeStatement() {
    request = new Request("SELECT TOP 10 Title, FirstName, LastName from SalesLT.Customer;", function(err) {
    if (err) {
        console.log(err);} 
    });
    var result = "";
    request.on('row', function(columns) {
        columns.forEach(function(column) {
          if (column.value === null) {
            console.log('NULL');
          } else {
            result+= column.value + " ";
          }
        });
        console.log(result);
        result ="";
    });

    request.on('done', function(rowCount, more) {
    console.log(rowCount + ' rows returned');
    });
    connection.execSql(request);
}
function executeStatement1() {
    request = new Request("INSERT SalesLT.Product (Name, ProductNumber, StandardCost, ListPrice, SellStartDate) OUTPUT INSERTED.ProductID VALUES (@Name, @Number, @Cost, @Price, CURRENT_TIMESTAMP);", function(err) {
     if (err) {
        console.log(err);} 
    });
    request.addParameter('Name', TYPES.NVarChar,'SQL Server Express 2014');
    request.addParameter('Number', TYPES.NVarChar , 'SQLEXPRESS2014');
    request.addParameter('Cost', TYPES.Int, 11);
    request.addParameter('Price', TYPES.Int,11);
    request.on('row', function(columns) {
        columns.forEach(function(column) {
          if (column.value === null) {
            console.log('NULL');
          } else {
            console.log("Product id of inserted item is " + column.value);
          }
        });
    });     
    connection.execSql(request);
}

关于防火墙规则,这取决于您运行应用程序的位置。如果你在 Heroku 上运行它,你必须添加 Heroku 服务器的 IP。它是 Linux 虚拟机吗?这是一个堆栈溢出answer,您可能想检查一下。

【讨论】:

  • 好的,我想我已经把这个范围缩小了一点。首先,它没有正确捕获用户名,因为我的代码有“用户名”,而不是正确的“用户名”。所以我修复了这个问题,现在当我尝试建立连接时它可以识别我的用户名。但是登录仍然失败...设置了防火墙规则。这是我在控制台中遇到的错误,以及堆栈跟踪:“消息:'用户登录失败 \'cweber105\'。',代码:'ELOGIN'}”
  • 你指定 encrypt = true 吗?
  • 是的,我不应该吗?
  • 如果我不包含加密,它的默认值为 false,并且 connection.on() 的主体甚至不会执行。如果为真,则执行正文,但我收到有关登录失败的错误。
  • 你绝对应该是!确保您的用户名+密码组合正确可能是个好主意。您是否尝试过 SSMS 等 GUI 工具来确保其正常工作?
【解决方案2】:

首先:连接字符串必须是 cultureofthefewpractice.database.windows.net - 最后缺少 .net。

第二:打开 SQL 数据库服务器的防火墙以允许来自节点服务器的流量(无论流量来自什么 IP 地址)。 SQL 数据库允许您指定 IP 范围(和多个范围)。

【讨论】:

  • 所有到数据库的流量都通过 heroku 上的节点服务器。如何确定要为哪个 IP 设置防火墙?
  • 您需要从 heroku 中找出您的 IP 地址 - 我不使用 heroku,无法引导您到那里。对于测试,至少,您可以简单地打开 SQL 数据库上的完整 ip 范围(0.0.0.0-255.255.255.255),以查看流量​​是否通过。
  • 好的。好吧,我为所有 IP 添加了防火墙规则,但仍然不行。还有其他想法吗?有没有办法可以查看正在发生的事情的日志?我在 Mac 上,控制台正在打印一些东西。胡言乱语:5/10/16 2:09:46.863 PM SpotlightNetHelper[675]: tcp_connection_tls_session_error_callback_imp 4467 __tcp_connection_tls_session_callback_write_block_invoke.434 error 22 5/10/16 2:09:49.917 PM WindowServer[186]: send在 ping 它在超时之前出列。
猜你喜欢
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
相关资源
最近更新 更多