2015-12-30 41 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。 –