【问题标题】:OPTIONS net::ERR_EMPTY_RESPONSE Angular - What are the CORS settings?选项 net::ERR_EMPTY_RESPONSE Angular - CORS 设置是什么?
【发布时间】:2019-11-11 23:58:31
【问题描述】:

我正在尝试向服务器上的 mongoDB 发出获取请求。这是我的网页将托管的同一台服务器。我创建了一个 API,以便网页可以向 mongoDB 发出请求。

我的第一个问题是它被 CORS 策略阻止,因此我对此进行了调查,发现的信息导致我将 corsOptions 添加到 server.js(服务器上运行的 API 文件)。

这是我的server.js(我在服务器上运行的API文件将网页与node.js连接到mongoDB):

// Dependencies
var express = require('express');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var cors = require('cors');
var app = express();


const corsOptions = {
    origin = true,
    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
    credentials: true,
    preflightContinue: true,
    maxAge: 600,
};
app.options('*', cors(corsOptions))
app.use(cors(corsOptions))

// MongoDB
mongoose.connect('mongodb://serverip:27017/database');

// Express
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

// Routes
app.use('/api', require('./routes/api'));

// Start server
app.listen(3000);
console.log('Listening on port 3000...');

我的.component.ts 运行一个简单的httpClient.get 请求来获取信息,如下所示:

const httpOptions = {
  headers: new HttpHeaders({
    'Access-Control-Allow-Origin': '*'
  })
};

this.httpService.get('http://serverip:3000/api/collection/', httpOptions).subscribe(
    result => {
        console.log(result);
    },
    error => {
        console.log('Error occured', error);
    }
)

我在 Google Chrome 中收到以下错误:

OPTIONS http://serverip:3000/api/collection/ net::ERR_EMPTY_RESPONSE

我已在WIN+R 中使用此命令运行 C​​hrome:

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security

我在那个 Chrome 上收到这个错误:

OPTIONS http://serverip:3000/api/collection/ net::ERR_EMPTY_RESPONSE

如果我删除 server.js 中与 CORS 相关的代码,并在没有网络安全的情况下在 Chrome 中加载网页,那么网页从 MongoDB 加载数据完全没有问题。

我还尝试将OPTIONS 放入server.js 中的methods,但我仍然遇到同样的错误。

我假设此错误来自corsOptions,但我需要更改/添加什么来解决此错误。

感谢任何帮助!

【问题讨论】:

  • 错误提示来自服务器的空响应。你对服务器有什么期望?你没有返回任何东西。
  • @MMSA 我期待一个 JSON 格式的响应,当使用禁用安全性的 Chrome 时,我得到了这个。 mongoDB 不是空白的,所以它应该返回这个。
  • 您是否尝试在两者中都将 serverIP 替换为 localhost?
  • @MMSA 将其全部更改为 localhost 时出现错误 Failed to load resource: net::ERR_EMPTY_RESPONSE
  • 您在浏览器中尝试过“serverip:3000/api/collection”吗?

标签: javascript node.js angular cors


【解决方案1】:

首先尝试使用 Postman 测试您的 API,以确保您得到正确的响应。其次尝试在没有任何选择的情况下添加 cors。这可确保您使用默认的 cors 选项,然后尝试一一添加。

app.use(cors())

最后,你不需要在你的http调用中添加任何headr,所以你可以删除这部分

const httpOptions = {
  headers: new HttpHeaders({
    'Access-Control-Allow-Origin': '*'
  })
};

【讨论】:

  • 这行得通!谢谢您的帮助!我认为缺少标题是导致我最初的 CORS 错误的原因。显然不是!
  • 其实这个header是浏览器在http调用中加入的,一般不需要覆盖。
【解决方案2】:

我猜你是否添加了

Access-Control-Allow-Origin: *
Content-Type: application/json
Cache-Control: no-cache

作为客户端调用的标头,这应该可以解决问题。

参考:“CORS GET returns an empty response body in Firefox

【讨论】:

  • 抱歉!我忘了在问题中包含我的标题!我现在将更新我的问题,我已经将Access-Control-Allow-Origin 作为标题,但没有其他两个。我添加了另外两个,我仍然有同样的错误
猜你喜欢
  • 2016-04-30
  • 2022-10-15
  • 2018-06-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2020-11-24
  • 2015-04-16
相关资源
最近更新 更多