Node.JS 中的跨域 POST 请求与预检?

Cross-domain POST request in Node.JS with preflight?

亲爱的大家,请注意我刚刚开始使用 Node。

我正在尝试从 HTML 表单获取跨域表单数据以在 Node.js 服务器中进行解析。我已经能够使用简单的 POST 数据来做到这一点,而不是使用需要预检的 POST 请求。

我是 运行 cloud9 app servers 上的节点代码。 我还使用 Cors module to handle the requests. This module works well with simple requests (test here 查看一个简单的请求工作),但是对于需要预检的请求,我从 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 开发工具中的 post 请求和响应:

事实证明,部分问题是 cloud9 服务器设置为私有,使这些请求全部重定向。

创建服务器 public 后,重定向停止。但是,我收到一条错误消息,指出 Node.js 服务器没有任何 Access-Control-Allow-Origin header 允许来自我的跨源域的请求。我注意到 "simple" with-out 预检请求会通过。因此,我没有试图理解为什么它在 Node.js 端不接受我的 allow-all-origin-configuration,而是决定序列化 POST 数据以摆脱预检要求并更改我的数据类型angular 请求纯文本。

要摆脱预检,首先摆脱任何 POST header 配置(缓存等),确保您的请求 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)); 
}));