0

親愛なる皆さん、私は Node.js を始めたばかりだと考えてください。

Node.js サーバーで解析する HTML フォームからクロスドメイン フォーム データを取得しようとしています。プリフライトを必要とする POST リクエストではなく、単純な POST データでこれを行うことができました。

私はcloud9 app serversで Node コードを実行しています。また、Corsモジュールを使用してリクエストを処理しています。このモジュールは、単純なリクエスト (単純なリクエストが機能することを確認するためにここでテストします) ではうまく機能しますが、プリフライトが必要なリクエストでは、Chrome インスペクター コンソールからこの結果を取得します。

XMLHttpRequest cannot load https://nms-motaheri-1.c9.io:8080/mail. 
The request was redirected to 'https://c9.io:8080/api/nc/auth?.....SHORTENED', 
which is disallowed for cross-origin requests that require preflight.

ここに私のserver.jsコードがあります:

// Define dependencies 
var express = require('express')
  , cors = require('cors')
  , app = express()
  , parse_post = require("parse-post");

// Core module config 
var corsOptions = {
  origin: '*',
  preflightContinue: true  // <- I am assuming this is correct 
};

app.use(cors(corsOptions));

// Respond to option request with HTTP 200
// ?? Why is this not answering my OPTION requests sufficiently ??
app.options('*',function(req,res){
  res.send(200);
});

// Give a hello world response to all GET requests 
app.get('/',function(req,res){
  res.sendFile(__dirname + '/index.html');
});

// Handle all POST requests to /mail
app.post('/mail', parse_post(function(req, res) {
    console.log(req.body);
    res.json({msg: 'This is CORS-enabled for all origins!'});
  })
);

// Listen on default Cloud9 port which is 8080 in this case
app.listen(process.env.PORT, function(){
  console.log('CORS-enabled web server listening on port ' + process.env.PORT);
});

これはなぜですか?また、プリフライトで POST の OPTION リクエストに満足に答えるにはどうすればよいですか?

ありがとう、助けていただければ幸いです。

Chrome 開発ツールでのポスト リクエストとレスポンスは次のとおりです。 ここに画像の説明を入力

4

1 に答える 1

0

問題の一部は、cloud9 サーバーがプライベートに設定されていて、これらのリクエストがすべてリダイレクトされていたことが判明しました。

サーバーを公開した後、リダイレクトは停止しました。Access-Control-Allow-Originしかし、クロス オリジン ドメインからのリクエストを許可するヘッダーが Node.js サーバーにないというエラーを受け取りました 。プリフライトのない「単純な」リクエストが通過することに気付きました。そのため、Node.js 側で allow-all-origin-configuration が受け入れられなかった理由を理解しようとする代わりに、POST データをシリアル化してプリフライト要件を取り除き、angular リクエストのデータ型をプレーンに変更することにしました。文章。

プリフライトを取り除くには、まず POST ヘッダー構成 (キャッシュなど) を取り除き、リクエストの Content-Type がプレーン テキストであることを確認し、実際のコンテンツもプレーン テキストであることを確認します。したがって、JSON の場合は、POST で送信する前に jQuery でシリアル化します。

これは、私の新しいAngular Postリクエストコードがどのように見えるかです:

sendEmail: function(email) {
    var config = {
        headers: { 
            'Content-Type': 'text/plain'
        }
    };
    var POSTDATA= JSON.stringify(POSTDATAJSON);
    return $http.post(POSTURL, POSTDATA, config)
}

Node.js では、cors Node.js モジュールを使用しています。

app.post('/mail', parse_post(function(req, res) {
    var postReq = JSON.parse(Object.keys(req.body)); 
}));
于 2015-09-18T00:51:41.007 に答える