我按照这里的教程在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'"
我还能够使用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
答案 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管理工具中的一个错误,希望很快就会消失。希望这可以节省其他人几个小时的调试时间。