express配置了cors仍然报错net::ERR_CONNECTION_RESET,携带cookie也报错

Express CORS配置详解
本文详细介绍了如何在Express中配置CORS,包括自定义CORS中间件的设置,使用npm安装的cors库,以及如何解决跨域请求失败的问题,特别是携带Cookie进行跨域请求的解决方案。

express配置cors

  1. 自己配置如果是自己配置返回头
var allowCors = function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    res.header('Access-Control-Allow-Credentials', 'true');
    next();
};
app.use(allowCors);//使用跨域中间件
  1. 可以使用npm install cors

  2. 也有一个更简单的方法就是使用express-cors代替cors

    const cors = require('express-cors')
    const express = require('express')
    const app = express();
    app.use(cors)
    app.listen(3000,()=>{
    	
    })
    

配置之后会发现依然不能请求,报错net::ERR_CONNECTION_RESET

查了下许多原因。得到的有:这个会关闭文件上传,所以需要手动开启文件上传才能避免。(来自网上,你们可以试试)

我的解决方法

  1. 跨域中间件的顺序很重要,一定要在其他中间件之前配置,否则无法生效

  2. 设置请求头和携带cookie会导致跨域请求失败
    在这里插入图片描述
    写明了请求头的限制,如果要携带请求头的话,需要在后端配置好就解决了。

    var allowCors = function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    // 新增加cors 运行的请求头
    res.header('Access-Control-Allow-Headers', 'Content-Type,lang,sfopenreferer ');
    res.header('Access-Control-Allow-Credentials', 'true');
    next();
    };
    app.use(allowCors);//使用跨域中间件
    

    cookie的问题解决方法有点不一样

    由于浏览器的安全设置,如果要携带cookie信息,就需要在响应报文头'Access-Control-Allow-Origin'*更改为请求的具体域名,如:

    var allowCors = function (req, res, next) {
    	// 修改*为请求的地址
    	res.header('Access-Control-Allow-Origin', 'http://localhost:8000');
    	res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    	// 新增加cors 运行的请求头
    	res.header('Access-Control-Allow-Headers', 'Content-Type,lang,sfopenreferer ');
    	res.header('Access-Control-Allow-Credentials', 'true');
    	next();
    };
    app.use(allowCors);//使用跨域中间件
    

    这样就可以了携带cookie进行跨域了

    需要配置多个allow-control-allow-origin

    可以使用判断值去判断

    	if(req.headers.origin === 'ip' || req.headers.origin =='ip2'){
    		res.header('Access-Control-Allow-Origin', req.headers.origin);
    	}
    	
    

    如果使用了第三方的cors设置

    可以去查看官方的文档,根据文档进行设置,具体就不细说了。
    就拿express-cors的配置

    // 传入相应的配置就可以解决跨域问题
    const cors = require('express-cors')({
    	allowOrigin:'ip地址'
    })
    
### 解决 `fetch` 请求时遇到 `net::ERR_CONNECTION_REFUSED` 错误 #### 原因分析 当浏览器尝试通过 `fetch` 发起 HTTP 请求并收到 `net::ERR_CONNECTION_REFUSED` 错误时,通常意味着目标服务器拒绝连接或无法建立连接。这可能是由于多种因素引起的: - **服务未启动**:如果目标服务器没有运行,则会立即返回此错误[^2]。 - **端口被占用**:即使服务器正在运行,但如果使用的端口号已被其他进程占用也会引发该问题。 - **防火墙阻止**:本地或远程网络中的防火墙设置可能会拦截请求,从而导致此类错误发生。 #### 解决策略 ##### 1. 验证服务器状态和服务可用性 确保目标 API 或 Web 应用程序的服务已经正常启动,并监听正确的 IP 地址和端口组合。可以通过命令行工具如 `curl` 来测试外部访问情况: ```bash curl http://localhost:8080/api/endpoint ``` ##### 2. 检查端口冲突 确认应用程序配置文件中指定的端口是否与其他已存在的服务相冲突。对于开发环境而言,默认情况下可以考虑更改应用所使用的端口号来规避潜在的问题。 ##### 3. 调整防火墙规则 如果是内部网络部署的应用,在某些企业环境中可能需要管理员权限才能修改安全策略;而对于云平台上的实例来说,则需查阅相应服务商文档了解如何调整入站流量控制列表(Security Groups)等措施以允许特定范围内的IP地址发起HTTP(S)请求。 ##### 4. 使用代理转发 在前端项目构建阶段,可通过配置 webpack-dev-server 的 proxy 属性实现资源共享(CORS),使得所有的 `/api/*` URL模式下的资源都将被重定向至实际提供数据接口的真实主机上处理。这样做的好处是可以绕过同源政策限制的同时也简化了URL管理逻辑。 ```javascript module.exports = { devServer: { proxy: { '/api': 'http://backend.example.com' } } }; ``` ##### 5. Electron 应用特殊处理 针对基于Electron框架构建桌面级Web App的情况,除了上述常规排查手段外还需要特别注意一点——即默认状态下 Chromium 内核会对所有 HTTPS 连接实施严格的证书验证机制。因此建议开发者们按照官方指南添加必要的命令行参数开关以便于调试期间忽略SSL认证失败带来的影响[^4]: ```javascript const { app } = require('electron'); app.commandLine.appendSwitch('ignore-certificate-errors'); // 启动主进程中... app.whenReady().then(() => { createWindow(); }); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值