2015-09-16 33 views
0

尊敬的各位,請考慮我剛剛開始使用Node。帶有預檢的Node.JS中的跨域POST請求?

我想從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); 
}); 

爲什麼會這樣,我怎麼能圓滿回答我的職務與飛行前的OPTION的要求嗎?

謝謝,任何幫助,將不勝感激。

這裏是POST請求和響應在Chrome開發工具: enter image description here

+0

你能發佈來自Chrome的DevTools的「網絡」標籤的請求和響應標頭? –

+0

嗨,我已編輯的問題添加到最後的屏幕截圖 - 謝謝。 – Mohammad

+1

閱讀本頁面:http://blog.dzhuvinov.com/?p=979 - 具體來說:「請記住重定向URL還必須包含Access-Control-Allow-Origin標頭,否則瀏覽器將在其試圖跨域請求的情況下停止在那裏。「 –

回答

0

原來,問題的一部分是,CLOUD9服務器設置爲私人制作這些請求重定向所有。

將服務器公開後,重定向停止。但是,我收到一個錯誤,指出Node.js服務器沒有任何Access-Control-Allow-Origin標頭來允許來自我的交叉源域的請求。我注意到「簡單」的無法預檢請求會通過。因此,我沒有試圖理解爲什麼它不接受我在Node.js端的allow-all-origin-configuration,而是決定序列化POST數據以擺脫預檢要求,並將我的角度請求中的數據類型更改爲普通文本。

爲了擺脫預檢,首先擺脫任何POST頭配置(緩存等),確保您的請求Content-Type是純文本,並確保您的實際內容也是純文本。因此,如果它在JSON中,則在使用POST發送它之前使用jQuery對其進行序列化。

這就是看起來像我的新角度支柱請求代碼:

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)); 
}));