node.js - CORS 错误,但仅在 POST 请求时出现,尽管有 cors 配置(GET 没有问题)

标签 node.js rest express cors

我使用 nodejs express 服务器。 尽管允许主机,我仍然有 CORS 错误

" No 'Access-Control-Allow-Origin' header is present on the requested resource."

但仅适用于 POST 端点。 “GET”没有问题。 我的客户端浏览器允许使用(GET 和 POST)端点:

我的服务器:(运行在 http://serverURL 上)

var whitelist = ['http://localhost:4200', 'http://someOtherDeployUrl.com']
var corsOptionsDelegate = function (req, callback) {
    var corsOptions;
    if (whitelist.indexOf(req.header('Origin')) !== -1) {
        corsOptions = {origin: true} // reflect (enable) the requested origin in the CORS response
    } else {
        corsOptions = {origin: false} // disable CORS for this request
    }
    corsOptions.methods= "GET,HEAD,PUT,PATCH,POST,DELETE"; 
    callback(null, corsOptions) // callback expects two parameters: error and options
}


router.post('/score', cors(corsOptionsDelegate), function (req, res, next) {
    ...
    res.status(200).send('Ok');
});

router.get('/scores', cors(corsOptionsDelegate), function (req, res, next) {
    res.status(200).send(scores);
});

客户端(angular 9):(在 localhost:4200 上运行)

  public saveScore(player, score) {
    console.log("save score")
    let objectObservable = this.http.post("http://serverURL/score", {
      player: player,
      score
    }).subscribe(
      data => console.log('success', data),
      error => console.log('oops', error)
    );

    return objectObservable

  }

  public getScores() {
    return this.http.get("http://serverURL/scores");
  }

知道为什么它不起作用吗?

GET 的整个请求/响应:

响应:

Referrer Policy: no-referrer-when-downgrade
Access-Control-Allow-Origin: http://localhost:4200
Content-Length: 2
Content-Type: application/json; charset=utf-8
Date: Sun, 14 Jun 2020 14:42:35 GMT
Etag: W/"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w"
Server: Cowboy
Vary: Origin
Via: 1.1 vegur
X-Powered-By: Express

要求:

Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: en,en-US;q=0.9,fr-FR;q=0.8,fr;q=0.7
Connection: keep-alive
DNT: 1
Host: serverUrl
If-None-Match: W/"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w"
Origin: http://localhost:4200
Referer: http://localhost:4200/menu
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36

(失败的)POST 的整个响应/请求 回应:

Allow: POST
Connection: keep-alive
Content-Length: 4
Content-Type: text/html; charset=utf-8
Date: Sun, 14 Jun 2020 14:30:00 GMT
Etag: W/"4-Yf+Bwwqjx254r+pisuO9HfpJ6FQ"
Server: Cowboy
Via: 1.1 vegur
X-Powered-By: Express

要求:

Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en,en-US;q=0.9,fr-FR;q=0.8,fr;q=0.7
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: serverUrl
Origin: http://localhost:4200
Referer: http://localhost:4200/menu
Sec-Fetch-Mode: cors
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36

最佳答案

尝试启用 CORS preflight (OPTIONS) handling为您的路线。

当您需要您的路由来处理所谓的复杂 CORS 操作时,您必须添加一个 OPTIONS 路由处理程序。浏览器发送一个额外的请求,一个 OPTIONS 请求。

为什么这么复杂?因为 cybercreeps。

添加此路由处理程序。就在你的帖子处理之前是一个很好的地方。

router.options('/score', cors())

关于node.js - CORS 错误,但仅在 POST 请求时出现,尽管有 cors 配置(GET 没有问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62374111/

相关文章:

node.js - Sequelize.js updateAttributes 不保存部分数据

java - 当子类通过 http 发送到 Java/Spring 时,如何识别它们?

java - 如何使用泛型类型解析来自其余调用的 json 列表?

rest - 使用 Symfony2 发送 REST 请求

javascript - connect-flash 和 jade : unable to show flash messahe

javascript - 我应该在 XMLHttpRequest 中使用什么回调函数来呈现响应?

javascript - 运行 mockgoose.prepareStorage 时,Mockgoose 下载 234mb

node.js - Sinopia(本地 NPM 注册中心)-数据库

Node.js 错误 - AssertionError [ERR_ASSERTION] : pattern should not use global or sticky mode . .. 重新安装包后

node.js - Nodejs : Is it secure to retrieve a file by express param?