Узел Express Корс выпуск - PullRequest
       4

Узел Express Корс выпуск

0 голосов
/ 21 марта 2020

Не могу понять, почему промежуточное ПО cors express не работает. Cors, express и e js все сохраняются в упаковке. json. Приложение работает нормально, если я добавляю прокси-сервер corsanywhere на внешнем интерфейсе, но я бы хотел обойти это на стороне сервера. любая помощь высоко ценится, я застрял на этом.

API находится в пути получения / просмотра индекса

ошибка: Доступ к выборке в 'https://api.darksky.net/forecast/' от источника 'http://localhost : 3000 'было заблокировано политикой CORS: в запрошенном ресурсе отсутствует заголовок «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}`)
});

на стороне клиента:

он работает с $ { прокси} там, но я хотел бы избавиться от этого

    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

``````

1 Ответ

1 голос
/ 21 марта 2020

Итак, если вы пытаетесь получить доступ к какой-либо другой службе https://api.darksky.net/forecast/ (которую вы не контролируете) со своей веб-страницы, то вы ничего не можете сделать, чтобы заставить COR работать для этого. Сервер api.darksky.net должен решить, разрешены ли COR или нет. Вы не можете это изменить.

Вы можете сделать запрос со своей веб-страницы на свой сервер, чтобы попросить ее получить для вас некоторые данные из api.darksky.net, а затем вернуть их на свою веб-страницу (работая в качестве простого прокси-сервера). Ваш сервер не подлежит никаким ограничениям COR при доступе к api.darksky.net. Только COR ограничены COR.

И, как вы обнаружили, вы также можете использовать прокси-сервис, который включает COR и извлекает данные для вас.

Предположим, вы хотите прокси части darksky API, вы можете сделать что-то простое, как это:

const express = require('express');
const app = express();
const request = require('request');
const apiRouter = express.Router();

// maps /api/forecast/whatever to http://api.darksky.net/forecast/developerKey/whatever
// and pipes the response back

const apiKey = "yourAPIKeyHere";

apiRouter.get("/*", (req, res, next) => {
    // parse out action and params
    // from an incoming URL of /api/forecast/42.3601,-71.0589
    // the /api will be the root of the router (so not in the URL here)
    // "forecast" will be the action
    // "42.3601,-71.0589" will be the params

    let parts = req.path.slice(1).split("/"); // split into path segments, skipping leading /
    let action = parts[0];                    // take first path segment as the action
    let params = parts.slice(1).join("/");    // take everything else for params
    request({
        uri: `https://api.darksky.net/${action}/${apiKey}/${params}`,
        method: "get"
    }).pipe(res);
});

app.use("/api", apiRouter);

app.listen(80);

Теперь, когда вы отправляете этот сервер, этот запрос:

 /api/forecast/42.3601,-71.0589

будет запрашивать:

 https://api.darksky.net/forecast/yourAPIKeyHere/42.3601,-71.0589

и отправьте результат обратно вызывающей стороне. Я запустил это тестовое приложение, и оно сработало для меня. Хотя я не видел ничего, кроме URL-адресов прогноза, в darksky. net API, он бы работал для любого формата /api/someAction/someParams.

Обратите внимание, вы, вероятно, НЕ хотите включать CORS на вашем сервер, потому что вы не хотите, чтобы веб-страницы других людей могли использовать ваш прокси. И, поскольку вы просто отправляете запросы на свой собственный сервер, вам не требуется CORS, чтобы это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...