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