“登录失败”从node.js连接到SQL-Azure(msnodesql)

时间:2013-03-17 23:31:36

标签: node.js azure odbc azure-sql-database

我按照这里的教程在Azure上构建连接到SQL-Azure数据库的node.js网站:

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 @ server,尝试使用ADO连接字符串代替)

我还能够使用jdbc在Java中成功连接。这是有效的jdbc连接字符串:

jdbc:sqlserver://xxxmyserver.database.windows.net:1433;DatabaseName=mydb;user=mylogin@xxxmyserver;password=pwd

这是node.js ODBC连接字符串不起作用:

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

我在这里完全不知所措,特别是因为我可以使用SSMS从本地连接好。其他人遇到同样的问题吗?

如果重要,我使用node.js v0.8.2(因为这是Azure的VM上的内容)和msnodesql v0.2.1

3 个答案:

答案 0 :(得分:1)

对于遇到此问题的任何其他人,即使在取出方括号后仍然遇到问题,您需要在Azure管理门户中设置一个标志,以使其他Azure服务能够连接到您的Azure SQL数据库。为了增加混淆,当您第一次创建它时,它会将您的IP地址添加到列表中,这就是为什么您似乎可以从您的开发机器而不是从Azure实例连接到它的原因。

无论如何,要执行此操作,请进入Azure管理门户中的数据库设置,转到允许的IP地址'并启用Windows Azure服务'在底部允许的服务下。

答案 1 :(得分:0)

尝试使用问号参数周围没有引号的查询。

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

字符串(或任何类型)参数不需要引号。参数是带外发送的,而不是直接替换到查询中。这使得它们更加安全,因为它们永远不会使用SQL进行评估。

答案 2 :(得分:0)

问题在于我的连接字符串的数据库部分 - 数据库名称周围的方括号导致了问题。 ODBC连接字符串Azure告诉您使用如下所示:

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

相反,你需要使用它:

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

请注意数据库名称周围没有方括号。

这看起来像是Azure管理工具中的一个错误,希望很快就会消失。希望这可以节省其他人几个小时的调试时间。