2012-02-17 37 views
0

は私が設定し、次のNode.jsサーバーはポート9001HTTPS経由でnode.jsサーバーにAJAXリクエストを送信するにはどうすればよいですか?

var https = require('https'); 
var fs = require('fs'); 
var qs = require('querystring');  
var options = { 
    key: fs.readFileSync('privatekey.pem'), 
    cert: fs.readFileSync('certificate.pem') 
}; 
https.createServer(options, function (req, res) { 
    res.writeHead(200); 
    console.log('Request Received!'); 
    console.log(req.method); 
    if (true || req.method == 'POST') { 
    var body = ''; 
    req.on('data', function (data) { 
     body += data; 
    }); 
    req.on('end', function() { 
     console.log(body); 
     var POST = qs.parse(body); 
     console.log(POST); 
    }); 
    } 
    res.end("hello, world\n"); 
}).listen(9001); 

に耳を傾けていると私は

function form_save() 
{ 
    console.log("submitted!"); 
    var data_obj = { 
    data1: "item1", 
    data2: "item2" 
    } 
    $.ajax({ 
    url: 'https://adam.testserver.com:9001/', 
    type: "POST", 
    dataType: "json", 
    data: data_obj, 
    success: function() { 
     console.log("success!"); 
    }, 
    complete: function() { 
     console.log("complete!"); 
    } 
    }); 
} 

がで発生した二つの問題がありますAJAX呼び出しに応答するために、このサーバーを取得しようとしています私の取り決め。最初は、私は、サーバーを起動してから、私のform_saveをトリガーボタンをクリックした場合()ノードサーバーが応答しないということで、私は次のエラーを取得:私がアクセスする場合は、この時点で

submitted! 
OPTIONS https://adam.testserver.com:9001/ Resource failed to load 
jQuery.extend.ajaxjquery.js:3633 
$.ajaxjquery.validate.js:1087 
form_savew_worksheet.php:64 
confirm_deletew_worksheet.php:95 
jQuery.event.handlejquery.js:2693 
jQuery.event.add.handlejquery.js:2468 
w_worksheet.php:73 
complete! 

をそのURLのdirecty( https://adam.testserver.com:9001/)「hello、world」の出力とコンソールメッセージ「Request Received! GET」が表示されます。この時点から、ボタンをクリックしてAJAX呼び出しをトリガーすると、新しいエラーが発生します。

submitted! 
XMLHttpRequest cannot load https://adam.testserver.com:9001/. Origin 
https://adam.testserver.com is not allowed by Access-Control-Allow-Origin. 
w_worksheet.php:73 
complete! 

私のフォームとノードサーバーの両方が同じサーバー上にあるため、このメッセージが表示される理由を理解できません。読んでくれてありがとう、ありがとう、私はこれに得ることができるすべての助けに感謝します。私はしばらくの間立ち往生してきた!

答えて

2

あなたはCross-Origin Resource Sharing(CORS)仕様に準拠しています。

出力にはOPTIONSが含まれています。 The OPTIONS HTTP Verbは、ブラウザがWebサーバを約のURLに照会するために使用され、GETの内容またはPOSTのデータではありません。

サーバーがCORS要求の正しいヘッダーデータで応答しないため、ブラウザはデータにアクセスする権利がないとみなし、URLへのGETまたはPOSTを拒否します。

あなたが本当にAJAXリクエスト世界のランで任意のウェブサイトをできるようにしたい場合は、次のような何かを行うことができます:

function handleOptions(request, response) { 
    response.writeHead(200, { 
     "Access-Control-Allow-Origin": "*", 
     "Access-Control-Allow-Method": "POST, GET, OPTIONS", 
     "Access-Control-Allow-Headers": request.headers["access-control-request-headers"] 
    }); 
    response.end(); 
} 

function server(request, response) { 
    if(request.method == "POST") { 
     handlePost(request, response); 
    } else if(request.method == "OPTIONS") { 
     handleOptions(request, response); 
    } else { 
     handleOther(response); 
    } 
} 
https.createServer(sslObj, server).listen(9001); 

あなたは詳細を記入して、あなたが別途GETを処理するかどうかをすることができ、 (handleOtherは、サポートしていないリクエストメソッドごとに適切なエラーコードを返す必要があります)。

+0

ありがとうございます!これはすばらしい情報で、私をつかまえて再び走った。それは機能しますが、なぜこれがクロスオリジンであると考えられるのか不思議です。それは私が提出しているフォームがApacheサーバーに座っていて、ノードサーバーのデータを処理しようとしているからですか?助けてくれてありがとう! – akronymn

+0

遅く返事を申し訳ありません。私は[これが理由だ]と思う(http://www.w3.org/TR/cors/#access-control-allow-origin-response-hea#user-agent-security)。 SSL証明書は異なる(したがって正式に2つの論理エンティティによって実行される)ため、すべてのHTTPS要求にCORSが必要なように見えます。 –

関連する問題