我的Node.js本地应用程序无法连接到Azure SQL DB

时间:2017-02-10 13:43:42

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

我正在使用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上连接有关?但不可能,因为管理工作室工作正常吗?)

2 个答案:

答案 0 :(得分:2)

如果您正在尝试使用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
  },

});

答案 1 :(得分:0)

我认为问题在于您的连接字符串,因为它看起来不像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;