2016-05-10 31 views
0

私はHeroku上で単純なNode.jsサーバーを実行しています。私はAzure SQLデータベースをセットアップしましたが、私はサーバからの接続を確立しようとしています。私はtedious.jsを使って接続しています。私が知る限り、私はドキュメントのパターンに従っていますが、接続は行われません。これは私が持っているコードです(ユーザー名とパスワードを変更しました)。今のところ、connect関数はブラウザから "/ data"ページへのGETリクエストで呼び出されますが、ページはロードされず、接続は決して通過しません。すべてのポインタ?Node.jsサーバーをAzure SQLデータベースに接続できません

var azure = require("azure-storage"); 

var Connection = require("tedious").Connection; 

var config = { 
    Server : "cultureofthefewpractice.database.windows", 
    username : "XXXXX", 
    password : "XXXXX", 
    options : { 
    port: 1433, 
    Database : "cultureofthefewpracticedatabase", 
    connectTimeout : 3000, 
    }, 
}; 


var connection = new Connection(config); 

function connect(request, response) { 
    connection.on("connect", function(error) { 
    //If no error, then good to go 
    console.log("Connected to database! Booyah."); 
    executeStatement(); 

    response.send("Connected to database! Booyah."); 
    }, function (info) { 
    console.log(info); 
    }); 
} 

exports.connect = connect; 
+0

あなたは意図的にユーザー名とパスワードを隠していましたが、「サーバー」URIには最後に '.net'がありません。あなたの本当のコードにもそれが欠落しているかどうかはわかりません - それが問題になります。また、あなたのノードアプリケーションからの着信接続を許可するために、SQLデータベースファイアウォールを開きましたか? –

+0

コードに.netがありませんでした。どうしたのかは分かりません。私はそれを付け加えた。私は自分のIPアドレスのためのファイアウォールルールをセットアップしました。私は私のマシンのIPを使うべきですか?または、私はherokuからサーバーのために使用すべき別のIPがありますか? – cweber105

+0

それはあなたのトラフィックが何であっても、SQLデータベースに入ります。私も答えとして投稿します。 –

答えて

2

私はコミュニティから提供された回答をエコーし​​ます。

var Connection = require('tedious').Connection; 
var config = { 
    userName: 'yourusername', 
    password: 'yourpassword', 
    server: 'yourserver.database.windows.net', 
    // When you connect to Azure SQL Database, you need these next options. 
    options: {encrypt: true, database: 'AdventureWorks'} 
}; 
var connection = new Connection(config); 
connection.on('connect', function(err) { 
    // If no error, then good to proceed. 
    console.log("Connected"); 
    executeStatement(); 
    //executeStatement1(); 

}); 

var Request = require('tedious').Request; 
var TYPES = require('tedious').TYPES; 

function executeStatement() { 
    request = new Request("SELECT TOP 10 Title, FirstName, LastName from SalesLT.Customer;", function(err) { 
    if (err) { 
     console.log(err);} 
    }); 
    var result = ""; 
    request.on('row', function(columns) { 
     columns.forEach(function(column) { 
      if (column.value === null) { 
      console.log('NULL'); 
      } else { 
      result+= column.value + " "; 
      } 
     }); 
     console.log(result); 
     result =""; 
    }); 

    request.on('done', function(rowCount, more) { 
    console.log(rowCount + ' rows returned'); 
    }); 
    connection.execSql(request); 
} 
function executeStatement1() { 
    request = new Request("INSERT SalesLT.Product (Name, ProductNumber, StandardCost, ListPrice, SellStartDate) OUTPUT INSERTED.ProductID VALUES (@Name, @Number, @Cost, @Price, CURRENT_TIMESTAMP);", function(err) { 
    if (err) { 
     console.log(err);} 
    }); 
    request.addParameter('Name', TYPES.NVarChar,'SQL Server Express 2014'); 
    request.addParameter('Number', TYPES.NVarChar , 'SQLEXPRESS2014'); 
    request.addParameter('Cost', TYPES.Int, 11); 
    request.addParameter('Price', TYPES.Int,11); 
    request.on('row', function(columns) { 
     columns.forEach(function(column) { 
      if (column.value === null) { 
      console.log('NULL'); 
      } else { 
      console.log("Product id of inserted item is " + column.value); 
      } 
     }); 
    });  
    connection.execSql(request); 
} 

ファイアウォールルールについては、アプリケーションをどこで実行しているかによって異なります。 Herokuで実行している場合は、HerokuサーバーのIPを追加する必要があります。 Linux VMですか?ここでは、チェックアウトする可能性のあるスタックオーバーフローanswerがあります。

+0

さて、私はこれを少し狭めたと思う。まず、適切な "userName"ではなく、 "username"がコードに含まれているため、ユーザー名を適切に捕捉できませんでした。だから私はそれを修正しました、そして今私は接続しようとすると私のユーザー名を認識します。しかし、ログインはまだ失敗します...ファイアウォールルールが設定されています。これは、スタックトレースと共にコンソールに表示されるエラーです。 "メッセージ: 'ユーザー' cweber105 \ 'にログインできませんでした。'、 コード: 'ELOGIN'}" – cweber105

+0

encrypt = trueを指定していますか? –

+0

はい、そうではありませんか? – cweber105

0

まず:接続文字列はcultureofthefewpractice.database.windows.netする必要があります - あなたは最後に.netを逃しています。

第2:SQLデータベースサーバーのファイアウォールを開いて、ノードサーバーからのトラフィック(トラフィックの発信元IPアドレス)を許可します。 SQLデータベースを使用すると、IP範囲(および複数の範囲)を指定できます。

+0

データベースへのすべてのトラフィックは、herokuのノードサーバーを経由します。ファイアウォールを設定するIPをどのように見つけることができますか? – cweber105

+0

あなたはherokuからあなたのIPアドレスを把握する必要があります - 私はherokuで動作しない、そこにあなたを導くことができませんでした。テストでは、少なくとも、トラフィックが流れているかどうかを確認するために、SQLデータベース(0.0.0.0-255.255.255.255)の完全なIP範囲を開くことができます。 –

+0

まあ、私はすべてのIPのためのファイアウォールルールを追加しましたが、まだ行っていません。他の考え?何が起こっているのかのログを見る方法はありますか?私はMacを使い、コンソールはいくつか印刷しています。私にはちんぷんかんぷん: 5/10/16 2:09:46.863 PM SpotlightNetHelper [675]:tcp_connection_tls_session_error_callback_imp 4467 __tcp_connection_tls_session_callback_write_block_invoke.434エラー22 5/10/16 2:09:49.917 PM WindowServer [186]:send_datagram_available_pingは:547のpid時間切れになる前にデキューしたpingに対処できませんでした。 – cweber105

関連する問題