2017-02-10 118 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; 
相關問題