【问题标题】:My Node.js local application won't connect to Azure SQL DB我的 Node.js 本地应用程序无法连接到 Azure SQL DB
【发布时间】:2017-06-28 21:20:04
【问题描述】:

我正在使用 Azure SQL DB(MS SQL Server 的云版本)开发一个 Node.js-Express-EJS Web 应用程序。

我首先尝试使用 SQL Server Management Studio 在远程 Azure SQL DB 上测试我的连接。首先,我将我的机器 IP 设置为在 Azure SQL DB 防火墙规则中允许。然后我就可以进入数据库,创建和填充表,并使用 Management Studio 进行查询。

现在,我首先在本地拥有 Node.js 应用程序。但是,它似乎无法使用相同的凭据连接到远程 Azure SQL DB。

首先,我使用node-mssql中的教程:

/* Using node-mssql */
var sql = require('mssql');

router.get('/test/mssql', function(req, res, next) {

    console.log('Testing node-mssql')

    sql.connect("mssql://<username>:<password>@<server>.database.windows.net/<db>")
        .then(function() {

            new sql.Request()
                .query('SELECT * FROM mytable')
                .then(function(recordset) {
                    console.dir(recordset);
                }).catch(function(err) {
                    console.log(err);
                });


        }).catch(function(err) {
            console.log(err);
        });
});

我只能从控制台获取

'Testing node-mssql'
GET /contact/test/mssql  - - ms - -

但是没有响应,似乎一直在等待,甚至没有抛出错误。

当我使用 Sequelize.js 时也会发生同样的事情

/* Using Sequelize.js */
var Sequelize = require('sequelize');

var sequelize = new Sequelize('<db>', '<username>', '<password>', {
  host: '<mydb>.database.windows.net',
  dialect: 'mssql',

  pool: {
    max: 5,
    min: 0,
    idle: 10000
  },

});

router.get('/test/sequelize', function(req, res, next) {

    console.log('Testing sequelize');

    sequelize.authenticate()
        .then(function(err) {
            console.log('Connection has been established successfully');
        })
        .catch(function(err) {
            console.log('Unable to connect to the database:', err);
        });
});

结果:

Testing sequelize
GET /test/sequelize - - ms - -

这是我正在使用的版本:

Node.js - 4.6.0
express - 4.14.0
mssql - 3.3.0
sequelize - 3.30.2
tedious - 1.14.0

(我想知道这是否与我使用 WiFi 连接有关?但不可能,因为 Management Studio 工作正常,对吧?)

【问题讨论】:

  • 首先要检查 SQL Azure 和连接问题是防火墙是否对客户端的 IP 地址开放。
  • @MikeS 这就是我所做的。我的 Management Studio 与 Azure SQL DB 的连接正常。在我启动 Node.js 应用程序的同一台机器上。
  • 您是否尝试在代码中提供端口号?
  • 另外,看看同样的代码能否连接到本地的Sql server实例。
  • @MikeS 当我将端口 1433 提供给连接字符串或配置时,也会发生同样的情况。

标签: node.js azure express azure-sql-database sequelize.js


【解决方案1】:

如果您使用 Azure SQL 数据库进行尝试,您需要将 ?encrypt=true 添加到您的连接字符串中,如下所示:

mssql://<username>:<password>@<server>.database.windows.net/<db>?encrypt=true

对于 Sequelize.js,你需要这个:dialectOptions: { encrypt: true }。代码如下所示:

var sequelize = new Sequelize('<db>', '<username>', '<password>', {
  host: '<mydb>.database.windows.net',
  dialect: 'mssql',

  // Use this if you're on Windows Azure
  dialectOptions: { 
    encrypt: true 
  },

  pool: {
    max: 5,
    min: 0,
    idle: 10000
  },

});

【讨论】:

  • 对不起,这适用于 mssql。 sequelize 也会出现同样的问题。无论如何,我已将您的帖子标记为正确答案。
【解决方案2】:

我认为问题出在您的连接字符串上,因为它看起来不像一个可以工作的 SQL 数据库连接字符串。

对于mssql,尝试如下连接:

var config = {
 server: "<servername>.database.windows.net",
 database: "<dbname>",
 user: "<username>",
 password: "<password>",
 port: 1433,
 options: {
       encrypt: true
   }
};

sql.connect(config).then(function() { ... } )

仅供参考,SQL 数据库(至少通过 .net)需要这样的连接字符串,因此您可能会成功将类似的连接字符串直接传递给 sql.connect()(尽管我没有尝试过):

Server=tcp:[serverName].database.windows.net;Database=myDataBase;
User ID=[LoginForDb]@[serverName];Password=myPassword;Trusted_Connection=False;
Encrypt=True;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多