2017-02-10 89 views
0

我正在使用Azure SQL数据库(MS SQL Server的云版本)开发Node.js-Express-EJS Web应用程序。我的Node.js本地应用程序将无法连接到Azure SQL数据库

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

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

首先,我使用教程节点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工作正常吗?)

+0

首先检查SQL Azure和连接问题是防火墙打开到客户端的IP地址。 – MikeS

+0

@MikeS这就是我所做的。 My Management Studio连接到Azure SQL DB正在工作。在启动我的Node.js应用程序的同一台机器上。 – menorah84

+0

您是否尝试在代码中提供端口号? – MikeS

回答

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 
    }, 

}); 
+0

这工作。我现在得到了回应。谢谢。 – menorah84

+0

对不起,这适用于mssql。续集上会发生同样的问题。无论如何,我已经标记了你的帖子是正确的答案。 – menorah84

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; 
相关问题