如何避免带有CORS节点请求包的预检OPTIONS请求?

时间:2015-06-16 14:16:56

标签: request cors options preflight

我只想发布一些json,但默认情况下请求会执行预检OPTIONS请求。

我想避免这种情况,因为用户经常会有不可靠的连接,额外的请求会进一步降低可靠性并导致出现“CORS被拒绝”这样的神秘错误消息。

var request = require('request');
function (data, cb) {
  if (!cb) cb = function () {};
  request({
    method: "POST",
    url: "someurl",
    json:true,
    body: data
  }, function (err, response, body) {
    if (err) cb(err);
    else if (response.statusCode != 200) {
      cb(new Error("log satus code: " + response.statusCode));
    } else {
      cb(null, body);
    }
  })

澄清我正在做一个实际的CORS并希望避免预检OPTIONS请求。我也控制了发球(虽然这无关紧要)。

2 个答案:

答案 0 :(得分:4)

预先选择OPTIONS请求是CORS流程的必需部分。没有其他办法了。但是,客户端可以缓存预检响应,因此它只需要实际执行一次预检请求,而不是每次POST时。

要启用预检请求缓存,预检请求必须使用Access-Control-Max-Age标头进行响应。此标头的值是允许客户端缓存响应的秒数。

例如,以下响应标头将允许客户端将预检响应缓存5分钟。

Access-Control-Max-Age: 300

您必须选择适合您的应用的值。如果您需要在将来更改预检响应,通常最好将此值设置为不太大的值。如果您允许将预检请求缓存一个月,则用户可能无法获得您的更改,直到其缓存在一个月后过期。

答案 1 :(得分:1)

Simple requests不需要预检请求。我猜测json: true设置了自定义Content-Type标头(很可能是application/json)。

Content-Type的简单值为:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

除这些值之外的任何内容都会触发预检请求。