【问题标题】:Creating server - handle CORS pre-flighted创建服务器 - 预先处理 CORS
【发布时间】:2015-12-31 07:41:22
【问题描述】:

我正在为我的在线扫雷游戏创建服务器,我必须处理登录信息。我正在以 JSON 对象的形式从客户端发送信息,现在我正在尝试解析它。但是,我使用“OPTIONS”方法收到消息。我知道这是预飞行的 CORS 并且我理解其背后的原因,但我的问题是:我如何处理这个请求,响应客户端“好的,您可以发送您的“POST”并解析它,以便我可以在数据库中注册人。有人可以帮忙吗?在此先感谢大家,祝大家新年快乐!

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

}

【问题讨论】:

  • 注意:origin:'*' 不能与授权标头一起使用。下面的示例正确使用了特定的来源
  • 另外,对于客户端,您必须为 XMLHttpRequest 指定 allowCredentials = true - 否则 cookie 不会与 cors 一起发送

标签: javascript ajax http server cors


【解决方案1】:

大部分情况下,您的想法是正确的。这是我通常使用的:

// 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 而不是 Express。 您可能应该研究一下或者至少研究 Connect 中间件,它对制作结构良好的应用程序和很容易掌握。

【讨论】:

  • 谢谢!在您的示例中,您使用的是 Connect,对吗?
  • 表达,但是是的,中间件概念来自 Connect。
猜你喜欢
  • 2019-07-20
  • 2018-11-12
  • 2014-05-23
  • 2019-06-17
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 2020-10-22
相关资源
最近更新 更多