如何使用 CORS 的节点请求包避免预检选项请求?

How to avoid preflight OPTIONS request with node request package for CORS?

我只是希望 post 一些 json 但默认情况下请求执行预检 OPTIONS 请求。

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

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 请求。我也可以控制发球(虽然这不重要)。

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

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

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

Access-Control-Max-Age: 300

您必须选择适合您的应用程序的值。将此值设置为不太大的值通常是个好主意,以防您将来需要更改预检响应。如果您允许将预检请求缓存一个月,则用户可能要等到他们的缓存在一个月后过期后才会收到您的更改。

Simple requests 不需要预检请求。我猜 json: true 设置了自定义 Content-Type header(最有可能 application/json)。

Content-Type 的简单值是:

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

任何超出这些值的值都会触发预检请求。