0

SQL-AzureDBに接続するAzure上にnode.jsWebサイトを構築するために、ここのチュートリアルに従いました。

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'"
  • ODBC接続文字列をAzure管理サイトから直接コピーしました
  • {ここにあなたのパスワード}を自分のパスワードに置き換えました
  • ユーザー名とパスワードが正しいことを4回確認しました(管理ツールに正常にログインでき、ローカルからSQL Server Management Studioを介してDBに正常に接続できます)
  • パブリックIPアドレスにIP例外を追加しました
  • 接続文字列をあちこちで編集してみました(ユーザー名をmylogin @ serverではなくmyloginに変更し、代わりにADO接続文字列を使用してみました)

また、jdbcを使用してJavaで正常に接続できました。機能したjdbc接続文字列は次のとおりです。

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

そして、これが機能しないnode.jsODBC接続文字列です。

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にあるため)とmsnodesqlv0.2.1を使用しています。

4

3 に答える 3

1

他の人がこれに遭遇し、角かっこを外しても問題が発生する場合は、他のAzureサービスがAzureSQLデータベースに接続できるようにするためにAzure管理ポータルに設定する必要のあるフラグがあります。混乱を加えるために、最初に作成すると、IPアドレスがリストに追加されます。そのため、開発マシンからは正常に接続できますが、Azureインスタンスからは接続できません。

とにかく、これを行うには、Azure管理ポータルのデータベースの設定に移動し、[許可されたIPアドレス]に移動して、下部の[許可されたサービス]の下にある[WindowsAzureサービス]を有効にします。

于 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 に答える