2015-12-30 77 views
1

我創建一個服務器到我的在線掃雷遊戲,我必須處理登錄信息。我從一個JSON對象的客戶端發送信息,現在我正試圖解析它。但是,我收到帶有「OPTIONS」方法的消息。我知道這是預先計劃好的CORS,我明白其背後的原因,但我的問題是:我如何處理這個請求,迴應客戶端「好吧,你可以發送你的」POST「並解析它,這樣我可以在數據庫中註冊人員。有人可以幫忙嗎?在此先感謝大家,祝大家新年快樂!創建服務器 - 處理CORS預衝

var formidable = require('formidable'); 
var http = require('http'); // 
var url = require('url'); 
var mysql = require('mysql'); 

var server = http.createServer(function(request, response) { 

response.setHeader("Access-Control-Allow-Origin", "*"); 
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"); 
response.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'}); //server responde 'text/plain; charset=utf-8' 
handle(request); // function to handle the reques 

}).listen(8020); 

console.log("Listen on port 8020 boy..."); 


function handle(request){ 

    console.log(request.url); 
    console.log(request.method); 

    if (request.url === '/register') { 
     var form = new formidable.IncomingForm(); 
     form.parse(request, function (err, fields, files) { 
     register(fields); 
    }); 
    } 
} 

function register(fields){ 
    console.log("Requested login/register. Here are the fields"); 
    console.log(fields); 
    //gotoDB(); 
} 

function gotoDB(){ 
    var conn = mysql.createConnection({ 

    host : 'localhost', // Connecting to DB.. 
    user : 'user', 
    password : 'UWish', 
    database : 'school' 
}); 

} 
+0

注意:起源:'*'不能與Authroization頭一起使用。下面的例子正確地使用了一個特定的來源 –

+0

另外,至於客戶端,你必須指定allowCredentials = true到XMLHttpRequest - 否則cookies不是隨着cors –

回答

2

你的想法是正確的,主要是。以下是我通常使用:

// CORS 
app.use(function (req, res, next) { 
    var origin = req.get('Origin') 

    if (!origin) { 
    return next() 
    } 

    if ((origin.indexOf('https://example.com') > 0)) { 
    res.set('Access-Control-Allow-Origin', origin) 
    res.set('Access-Control-Allow-Methods', 'GET, POST, PUT') 
    res.set('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Authorization') 
    } 

    if (req.method.toLowerCase() === 'options') { 
    return res.sendStatus(200) 
    } 

    next() 
}) 

我只注意到你正在使用Node.js的香草和不表達。您應該仔細研究一下,或者至少可以使用Connect中間件,這對於製作結構良好的應用程序有很大的幫助,而且很容易掌握。

+0

謝謝!在你的例子中,你使用Connect,對吧? –

+0

表示,但是中間件概念來自Connect。 –