3

次のような nodejs アプリをセットアップしました。

var express =   require('./../../../Library/node_modules/express'); 
var https = require('https');
var app = express();

httpsOptions = {
  key: fs.readFileSync('privatekey.pem'), 
  cert: fs.readFileSync('certificate.pem')  // SELF-SIGNED CERTIFICATE
}

var server = https.createServer(httpsOptions);
app.get('/myservice', function(req, res) {
...
}
server.listen(8443);

インバウンド要求用にサーバーで 8443 ポートを開きました。ブラウザーから開くhttps://mydomain/myservice:8443と、ブラウザーから信頼できない接続の警告が表示されますが、これは論理的なようです。

次に、(クロスドメインの問題をテストするために) ローカル コンピューターから実行する test.html から、次のようにします。

function testService(){
   var data =  { some JSON };

    $.ajax({
            url: 'https://myserver:8443/myservice',
            dataType: "jsonp",
            data: data,   
            jsonpCallback: "_mycallback",
            cache: false,
            timeout: 5000,
            success: function(data) {
                alert(data);
            },
            error: function(jqXHR, textStatus, errorThrown) {
                alert('Error: ' + textStatus + " " + errorThrown);
            }
        });
}

私の問題は、このリクエストがタイムアウトすることであり、サービスに到達することさえないと思います。

  1. 理由はありますか?

  2. このリクエストがサーバーに到達するたびに、できればあなたの親切な応答のおかげで、信頼できない証明書に関するブラウザの警告はどうなりますか? $.ajax()サーバーを静かに呼び出して応答を受信するのをやめますか?

4

1 に答える 1

1

クライアントの JSONP リクエストがタイムアウトする理由は、実質的に何でもあります。JSONP の動作方法により、リクエストが失敗したか成功したかしかわかりません。失敗した場合は、常にタイムアウトが原因です。とはいえ、サーバーの自己署名証明書をクライアントに保存していない場合、失敗することはほぼ保証されています。そのためには、サーバーの証明書を常に信頼するようにブラウザに指示してください。Firefox では、Preferences->Encryption->View Certificates->Your Certificates->Import... に移動して、証明書を Firefox に追加することもできます。他のブラウザにも同様のインターフェースが必要です。

潜在的なクロス ドメインの問題を解決するには、以下を に追加してみてくださいapp.get('/myservice')

res.header("Access-Control-Allow-Origin:", "*");
res.header("Access-Control-Allow-Methods:", "GET");

さらに、ブラウザが異なれば、これらの処理も異なります。私の経験では、Firefox は Chrome より寛大な場合もありますが、両方でテストすることは間違いありません。

HTTPS の問題をテストするには、まず通常の Expressjs サーバー (暗号化なし) を設定し、リクエストで https:// を使用しないようにします。リクエストが成功した場合、問題は SSL にあることがわかります。その場合は、ブラウザーがセキュリティ警告を表示したときに、そのサイトを信頼できるホストに永続的に追加できるオプションを有効にしてください。

また、私はこの行を信じています:

var server = https.createServer(httpsOptions);

次のようにする必要があります。

var server = https.createServer(httpsOptions, app);

(出典: http://expressjs.com/api.html#app.listen )

デバッグ用に以下のコードを追加することもvar server = https.createServer(httpsOptions);できます (サーバーがリクエストを受信したかどうかを簡単に確認できるようにするため)。

app.get('*', function(req, res, next) {
    // You *should* also be able to add the response headers here, although I haven't tried.
    console.log('Request received', req, res);
    next();
})

うまくいけば、それは役に立ちます!

于 2012-09-19T04:07:57.127 に答える