我遵循这里的教程,在Azure上构建一个连接到SQL的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
发布于 2013-03-26 03:09:53
问题在于我的连接字符串中的数据库部分--数据库名称周围的方括号是造成问题的原因。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管理工具中的一个bug,希望很快就会消失。希望这能节省其他人几个小时的调试时间。
发布于 2015-03-17 19:53:08
对于其他人来说,即使去掉方括号,也仍然会遇到这个问题,您需要在Azure管理门户中设置一个标志,以使其他Azure服务能够连接到Azure SQL数据库。为了增加混乱,当您第一次创建它时,它会将您的IP地址添加到列表中,这就是为什么您似乎能够从您的dev计算机而不是从Azure实例很好地连接到它。
无论如何,要做到这一点,请进入Azure管理门户中的数据库设置,转到“允许的IP地址”,并在“允许的服务”下启用“Windows服务”。
发布于 2013-03-19 22:55:05
在查询时不要使用问号参数周围的引号。
var select = "select userID, clientID from users where username_e = ? AND pwd_e = ?";字符串(或任何类型的)参数不需要引号。参数从带外发送,而不是直接替换到查询中。这使得它们更加安全,因为它们从未使用SQL进行评估。
https://stackoverflow.com/questions/15467578
复制相似问题