0

我按照这里的教程在 Azure 上构建了一个连接到 SQL-Azure DB 的 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 连接字符串
  • 我用我的密码替换了 {your password here}
  • 我四次检查用户名和密码是否正确(我可以成功登录管理工具,并且可以通过本地 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 虚拟机上的内容)和 msnodesql v0.2.1

4

3 回答 3

1

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

无论如何,要做到这一点,请进入 Azure 管理门户中的数据库设置,转到“允许的 IP 地址”并在底部允许的服务下启用“Windows Azure 服务”。

于 2015-03-17T19:53:08.127 回答
0

尝试不带问号参数引号的查询。

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

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

于 2013-03-19T22:55:05.023 回答
0

问题出在我的连接字符串的数据库部分 - 数据库名称周围的方括号导致了问题。Azure 告诉您使用的 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;

相反,当您需要使用它时:

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 管理工具中的一个错误,有望很快消失。希望这可以节省其他人几个小时的调试时间。

于 2013-03-26T03:09:53.580 回答