首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“登录失败”从node.js连接到SQL-Azure (msnodesql)

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

Stack Overflow用户
提问于 2013-03-17 23:31:36
回答 3查看 1.9K关注 0票数 0

我遵循这里的教程,在Azure上构建一个连接到SQL的node.js网站:

http://www.windowsazure.com/en-us/develop/nodejs/tutorials/web-site-with-sql-database/

下面是我的.js代码:

代码语言:javascript
复制
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上运行它时,我总是

代码语言:javascript
复制
"Login failed for user 'mylogin'"
  • 我直接从Azure管理站点复制ODBC连接字符串。
  • 我用我的密码替换了{你的密码}
  • 我四次检查用户名和密码是否正确(我可以成功地登录管理工具,并且可以通过从本地连接到DB )
  • 我为我的公共IP地址添加了一个IP异常作为一个好的措施。
  • 我试着到处编辑连接字符串(将用户名改为mylogin,而不是mylogin@server,而是使用ADO连接字符串)

我还能够使用jdbc在Java中成功地连接。以下是工作的jdbc连接字符串:

代码语言:javascript
复制
jdbc:sqlserver://xxxmyserver.database.windows.net:1433;DatabaseName=mydb;user=mylogin@xxxmyserver;password=pwd

下面是无法工作的node.js ODBC连接字符串:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-26 03:09:53

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

代码语言:javascript
复制
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;

当您需要使用以下内容时:

代码语言:javascript
复制
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,希望很快就会消失。希望这能节省其他人几个小时的调试时间。

票数 0
EN

Stack Overflow用户

发布于 2015-03-17 19:53:08

对于其他人来说,即使去掉方括号,也仍然会遇到这个问题,您需要在Azure管理门户中设置一个标志,以使其他Azure服务能够连接到Azure SQL数据库。为了增加混乱,当您第一次创建它时,它会将您的IP地址添加到列表中,这就是为什么您似乎能够从您的dev计算机而不是从Azure实例很好地连接到它。

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-19 22:55:05

在查询时不要使用问号参数周围的引号。

代码语言:javascript
复制
var select = "select userID, clientID from users where username_e = ? AND pwd_e = ?";

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15467578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档