具有预检功能的Node.JS中的跨域POST请求?

时间:2015-09-16 22:53:29

标签: node.js forms post cors preflight

亲爱的,请考虑我刚开始使用Node。

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

我在cloud9 app servers上运行节点代码。 我也使用Cors模块来处理请求。此模块适用于简单的请求(测试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开发工具中的帖子请求和响应: enter image description here

1 个答案:

答案 0 :(得分:0)

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

将服务器公开后,重定向停止。但是,我收到一个错误,即Node.js服务器没有任何Access-Control-Allow-Origin标头允许来自我的跨域域的请求。我注意到&#34;简单&#34;没有预检请求会通过。因此,我没有尝试理解为什么它不接受我在Node.js端的allow-all-origin配置,而是决定序列化POST数据以摆脱预检要求,并将我的角度请求中的数据类型更改为plain文本。

要摆脱预检,首先要删除任何POST标头配置(缓存等),确保您的请求Content-Type是纯文本,并确保您的实际内容也是纯文本。因此,如果它是在JSON序列化它在jQuery之前发送它与POST。

这是我的新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)); 
}));