Node.js HTTP请求从邮递员和节点开始工作,但不响应
在堆栈溢出问题上有一些类似的问题,并且建议的解决方案都不起作用,所以我将详细介绍这个案例以及我所尝试的 我有一个托管在Cloud Run上的服务器应用程序,只有在请求授权头中使用适当的承载令牌才能访问该应用程序。我尝试过通过Postman和来自本地Nodejs服务器的Axios请求访问它,并使用了授权头,效果很好。使用React(专门创建React应用程序),我得到以下错误:Node.js HTTP请求从邮递员和节点开始工作,但不响应,node.js,reactjs,authorization,google-cloud-run,Node.js,Reactjs,Authorization,Google Cloud Run,在堆栈溢出问题上有一些类似的问题,并且建议的解决方案都不起作用,所以我将详细介绍这个案例以及我所尝试的 我有一个托管在Cloud Run上的服务器应用程序,只有在请求授权头中使用适当的承载令牌才能访问该应用程序。我尝试过通过Postman和来自本地Nodejs服务器的Axios请求访问它,并使用了授权头,效果很好。使用React(专门创建React应用程序),我得到以下错误:访问位于的XMLHttpRequest'https://myserver-lhp5a9xp5a-ue.a.run.app/
访问位于的XMLHttpRequest'https://myserver-lhp5a9xp5a-ue.a.run.app/api/rules“起源”http://localhost:3000'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在'access control Allow Origin'标头。
在服务器端,我得到了当传递了错误的授权令牌时Cloud Run给出的403错误。另外,当我允许从云运行端进行未经验证的访问时(因此不需要授权头),请求工作正常,因此看起来这确实是授权头的问题,而不是CORS的问题
此外,我在服务器端处理COR。以下是我的服务器端代码:
var express = require('express');
var router = express.Router();
const cors = require('cors');
router.options('/api/rules', cors());
router.get('/api/rules', cors(), (req, res, next) => {
res.status(200).send()
});
这是我的代码:
const axiosInstance = axios.create({
baseURL: process.env.REACT_APP_API_BASE_URL
});
const buttonClickHandler = async (event) => {
const resp = await axiosInstance.get('/api/rules'
, {
headers: {
'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZ...' // I used this token within the same minute when trying the request via Postman or from my Nodejs app, so a token expiry isn't the issue.
}
}
)
console.log(resp.data)
}
以下是我到目前为止所做的尝试:
- 使用fetch而不是axios-相同错误
- 使用相同的令牌,在相同的5秒钟内,从邮递员或Nodejs服务器发送请求——效果很好
- 使用axios拦截器设置授权-相同错误
- 删除授权周围的单引号-相同错误
- 将请求发送到我的Nodejs服务器,并对标头执行console.log以确保正确传递授权令牌(它是)
- 不使用axios实例,但在请求中拼写完整URL-相同错误
- 在我的云运行服务器上尝试其他端点-相同错误
- 部署我的React应用程序从https端点提供服务,并从那里发送请求-相同的错误
- 将
添加到标题Accept:'*/*'
- 将
添加到标题'Accept':'*/*'
- 将
添加到标题中'Content-Type':'application/json'
- 以上三点的所有组合
- CORS是一种内置于web浏览器中的机制。这不是UI代码问题
- 要修复CORS问题,您需要在API(服务器)端进行更改
- TLDR
以下是幕后工作: 浏览器:在向API端点发送任何新请求之前,发送
选项
调用以检查服务器类型并获取标头。它检查访问控制是否允许原点
。考虑到这一点,Access Control Allow Origin
header只指定允许哪些跨原点,尽管默认情况下浏览器只允许相同的原点
邮递员:通过使用选项
调用服务器,直接发送获取
、发布
、删除
等请求,而不检查服务器类型并获取标题访问控制允许来源
您必须在服务器中配置
访问控制允许源站标题以解决CORS问题。我在挖掘之后找到了答案,感谢@aniket kolekar为我指明了正确的方向
当邮递员或Nodejs服务器查询端点时,如GET
、POST
、PUT
、DELETE
,他们发送呼叫时不首先检查选项。创建一个应用程序
我查询的服务托管在Cloud Run上,不允许未经验证的调用。因此,虽然我在通话中加入了授权标题以进行GET
通话,但它并未包含在飞行前选项中。其实,
云运行PM回答说,这是云运行的已知问题。我现在要解决的问题是在Cloud Run上托管两个服务—一个不需要身份验证,并且有效地充当代理服务器,将呼叫从客户端服务路由到屏蔽服务器服务。谢谢!但不幸的是,我不认为这是答案:1)我在服务器端已经有了选项和cors()处理(好的一点-我会在问题中添加代码)2)当我允许在服务器端进行未经验证的调用时(原则上,这与cors无关),请求工作正常。您是如何使用身份验证中间件的?是否有类似于router.get('/api/rules',**auth**,cors(),(req,res,next)=>{
?很高兴我能帮上忙