2013-03-17 68 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的服务”下允许的服务在底部。