2013-03-17 74 views
0

我也跟着教程這裏建立在Azure上一個node.js的網站連接到SQL-Azure的DB:「登錄失敗」 連接到SQL-Azure的Node.js的距離(msnodesql)

http://www.windowsazure.com/en-us/develop/nodejs/tutorials/web-site-with-sql-database/

下面是我的.js代碼的樣子:

var sql = require('msnodesql'), 
nconf = require('nconf'); 

exports.authenticate = function(req, res){ 

var select = "select userID, clientID from users where username_e = '?' AND pwd_e = '?'"; 
nconf.env().file({ file: 'config.json' }); 
var conn = nconf.get("SQL_CONN"); 
console.log(conn); 

sql.query(conn, select, [req.param('username'), req.param('password')], function(err, results) { 
    if(err) 
     throw err; 
    console.log(results); 

    if(results.length == 0) { 
     // no match 
     res.redirect('/login?failed=true'); 
    } else { 
     // authenticated 
     res.redirect('/start'); 
    } 
}); 
return; 

};

但是,當我在我的本地node.js的運行它,我不斷收到

"Login failed for user 'mylogin'" 
  • 我直接從Azure管理 站點複製ODBC連接字符串
  • 我更換{您的密碼在這裏}與我的密碼
  • 我四重檢查了用戶名和密碼是否正確(我可以成功登錄到管理工具,並且我可以通過SQL Server Management Studio從本地連接到數據庫)
  • 我增加了一個IP例外,我的公網IP地址爲
  • 我試圖在這裏編輯連接字符串,並有很好的措施(改變用戶名mylogin而不是mylogin @服務器,而是使用ADO連接字符串試過)

我也可以使用jdbc在Java中成功連接。下面是工作的JDBC連接字符串:

jdbc:sqlserver://xxxmyserver.database.windows.net:1433;DatabaseName=mydb;[email protected];password=pwd 

下面是不起作用Node.js的ODBC連接字符串:

Driver={SQL Server Native Client 10.0};Server=tcp:xxxmyserver.database.windows.net,1433;Database=[mydb];[email protected];Pwd=pwd;Encrypt=yes;Connection Timeout=30; 

我只是完全在這裏的損失,尤其是因爲我可以連接罰款從我的地方使用SSMS。其他人遇到同樣的問題?

在它的事項,我如何使用Node.js v0.8.2(因爲這是什麼Azure上的VM)的情況下和msnodesql v0.2.1

+0

是否有密碼的任何特殊字符?只是wodnering如果你有你逝去的密碼PARAM任何URL編碼問題 – 2013-03-19 05:17:37

+0

不錯的想法,但沒有 - 只有大/小寫和數字 – 2013-03-19 12:30:09

+0

這裏是另一個有趣的皺紋:我可以使用JDBC從Java連接就好了,但仍然沒有骰子與node.js.我將編輯兩個連接字符串到問題主體 – 2013-03-20 02:59:46

回答

0

問題出在我的連接字符串的數據庫部分 - 數據庫名稱周圍的方括號引起了問題。在ODBC連接字符串Azure的告訴你使用如下:

Driver={SQL Server Native Client 10.0};Server=tcp:xxxmyserver.database.windows.net,1433;Database=[mydb];[email protected];Pwd=pwd;Encrypt=yes;Connection Timeout=30; 

當你反而需要使用這樣的:在各地的數據庫名方括號

Driver={SQL Server Native Client 10.0};Server=tcp:xxxmyserver.database.windows.net,1433;Database=mydb;[email protected];Pwd=pwd;Encrypt=yes;Connection Timeout=30; 

注缺乏。

這看起來像是Azure管理工具中的一個錯誤,它很快就會消失。希望這可以爲別人節省幾個小時的調試時間。

+0

或隨意責怪msnodesql ...不知道如果數據庫= [dbname];而不是Database = dname;應該由ODBC支持 – 2013-03-26 03:24:59

0

試着查詢周圍沒有問號參數報價。

var select = "select userID, clientID from users where username_e = ? AND pwd_e = ?"; 

字符串(或任何類型的)參數不需要引號。參數是帶外發送的,而不是直接替換爲查詢。這使得它們更加安全,因爲它們從不用SQL進行評估。

+0

感謝您的想法 - 很好知道。我改變了我的查詢(甚至完全刪除的參數只是爲了測試),但仍然獲得「用戶登錄失敗‘myLogin’」 :( – 2013-03-20 02:33:49

+0

我假定「登錄失敗‘myLogin’」是你的網頁,而不是從SQL Server的實際錯誤?您可以將回調中的'throw err'更改爲 '''' console.log(err); return; ''''' 查看錯誤是什麼。 SQL Server應具有'[微軟] [SQL服務器]'和類似標記。 – 2013-03-20 18:13:10

+0

而且不包括'''。顯然的StackOverflow不知道Github上降價變種和我5分鐘跑了出去。:) – 2013-03-20 18:19:27

1

爲了其他任何人碰到這個絆腳石,甚至取出方​​括號後仍然得到問題,您需要在Azure的管理門戶,使其他Azure服務連接到您的Azure的SQL數據庫設置一個標誌。爲了增加混淆,首次創建它時,會將IP地址添加到列表中,這就是爲什麼您似乎能夠從開發計算機正確連接到它的原因,但不能從您的Azure實例連接到它。

總之,要做到這一點,進入數據庫的設置在Azure管理門戶網站,進入「允許的IP地址」,並啓用「Windows Azure的服務」下允許的服務在底部。