当前位置: 首页 > 后端技术 > Node.js

node server响应头设置允许跨域,却仍然存在跨域问题的解决方案

时间:2023-04-03 12:10:06 Node.js

node服务器响应头设置允许跨域,不过跨域问题还是有解决方法Cross-domain),服务器大致如下constexpress=require('express')constapp=express()app.use(express.json());app.use(express.urlencoded({extended:false}));app.post('/login',(request,response)=>{//允许跨域响应。setHeader('Access-Control-Allow-Origin','*')response.setHeader('Access-Control-Allow-Headers','*');response.send('Hello')})前端是一个axios发送的ajax请求,这里会有点影响,但是重点不在这里,所以这里就不贴代码了。原因分析点击浏览器的网络调试界面,发现除了post请求还有一个options请求,再看控制台报错AccesstoXMLHttpRequestat'http://127.0.0.1:8000/login'来自来源'http://localhost:3000'已被CORS策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在'Access-Control-Allow-Origin'标头。原来是preflightrequest问题是这个options请求的跨域没有通过。那为什么会有这个preflight呢?查阅CORS文档,发现有三种情况会发送前置请求:请求方法不是GET/POST/HEAD设置了默认请求头UnexpectedcustomrequestheaderPOST请求中的content-type是不是application/x-www-form-urlencodedmultipart/form-datatext/plain但是我们使用的axios发送的请求默认的content-type是application/json,所以我们当然要发送这个pre-request,那么我们只需要让这个预请求跨域通过即可。解决方法是更改??服务器路由规则(post->all)是最暴力的方法,直接给所有请求类型跨域,所以前置请求的选项必须是跨域app.all('/login',(request,response)=>{//允许跨域response.setHeader('Access-Control-Allow-Origin','*')response.setHeader('Access-Control-Allow-Headers','*');response.send('Hello')})为options添加路由规则这才是对症下药。在下面添加一个新规则并使用选项requesttypeapp.post('/login',(request,response)=>{//允许跨域response.setHeader('Access-Control-Allow-Origin','*')response.setHeader('Access-Control-Allow-Headers','*');response.send('Hello')})app.options('/login',(request,response)=>{response.setHeader("Access-Control-Allow-Origin","*")response.setHeader("Access-Control-Allow-Headers","*");response.end()})