【发布时间】:2023-03-08 01:09:01
【问题描述】:
我不明白为什么 cors express 中间件不起作用。 cors、express 和 ejs 都保存在 package.json 中。如果我在前端添加 corsanywhere 代理,该应用程序可以正常工作,但我喜欢在服务器端解决这个问题。非常感谢任何帮助我一直坚持这一点。
api 在获取视图/索引路径中
错误是: CORS 策略已阻止从源“http://localhost:3000”获取“https://api.darksky.net/forecast/”的访问权限:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。
const express = require('express');
const app = express();
const ejs = require('ejs');
const cors = require('cors');
const PORT = process.env.PORT || 3000;
// app.use((req, res, next) => {
// res.header('Access-Control-Allow-Origin', '*')
// res.header('Access-Control-Allow-Headers', 'Origin', 'X-Requested-With')
// next();
// });
app.use(cors());
app.use(express.static(__dirname + '/Public'));
app.set('view engine', 'ejs');
app.get('/', cors(), (req, res) => {
res.render(__dirname + '/Views/index')
});
app.listen(PORT, () => {
console.log(`server is listening on ${PORT}`)
});
客户端:
它可以与那里的 ${proxy} 一起使用,但我想摆脱它
if(navigator.geolocation){
navigator.geolocation.getCurrentPosition(position => {
long = position.coords.longitude;
lat = position.coords.latitude;
var proxy = 'https://cors-anywhere.herokuapp.com/'
var api = `${proxy}https://api.darksky.net/forecast/042750f3abefefdfe2c9d43cf33ce576/${lat},${long}`;
fetch(api)
.then(response => {
return response.json();
})
.then(data => {
let {temperature, summary, icon,} = data.currently;
temperatureDegree.textContent = Math.floor(temperature);
temperatureDescription.textContent = summary;
locationTimezone.textContent = data.timezone;
setIcons(icon, document.querySelector('.icon'
w
``````
【问题讨论】:
-
定义“不起作用”。
-
显示您尝试发送跨域的请求。我们需要确切地看到该请求是什么样的。而且,我们想看看到底是什么错误。
-
您能否显示客户端请求的代码,以便我们准确查看您发送的请求类型、内容类型、自定义标头等?这决定了需要什么级别的 COR 支持。
-
因此,如果您尝试从您的网页访问某些其他服务
https://api.darksky.net/forecast/t(您无法控制),那么您无能为力让 COR 发挥作用.由api.darksky.net服务器决定是否允许使用 COR。你无法改变这一点。您可以让您的网页要求您的服务器为您从api.darksky.net获取一些数据,然后将其返回到您的网页(作为一个简单的代理)。访问api.darksky.net时,您的服务器不受任何 COR 限制。只有浏览器受 COR 限制。 -
好的,谢谢。