У меня возникают ошибки CORS иногда при размещении моего сервера Node.js Express на Heroku и попытке подключиться к нему с помощью приложения React, размещенного на Netlify. У меня нет проблем с локальным запуском (несмотря на то, что интерфейс и бэкэнд - это разные URL).
Я получаю:
Доступ к XMLHttpRequest по 'https://[backend -heroku-url] ' из источника 'https://[frontend -netlify-url] ' заблокирован политикой CORS : На запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».
Я использую пакет 'cors' npm, который должен разрешать все по умолчанию.
app.js
const express = require("express");
const cors = require("cors");
const trackRoutes = require("./routes/trackRoutes");
const app = express();
app.use(cors());
app.use("/tracks", trackRoutes);
const port = process.env.PORT || 4000;
const server = app.listen(port, () => {});
trackRoutes.js
const express = require("express");
const router = express.Router();
const cors = require("cors");
router.all("*", cors());
const controller = require("../controllers/tracks");
router.get("/", cors(), controller.getTracks);
router.get("/download", cors(), controller.downloadTrack);
module.exports = router;
trackController.js
const { Track } = require("../db/db");
exports.getTracks = async (req, res, next) => {
const results = await Track.findAll({ raw: true });
res.status(201).json(results);
};
exports.downloadTrack = async (req, res) => {
const id = req.query.id;
const filePath = path.join(global.tempPath, id + ".mp3");
blob.getBlobToLocalFile("tracks", id, filePath, err => {
if (err) throw err;
try {
res.download(filePath, () => {
fs.unlink(filePath);
});
} catch (error) {
fs.unlink(filePath);
}
});
};
На клиенте (приложение React)
<a href='https://[backend-heroku-url]/tracks/download?id=123'>
На стороне клиента я просто использую ссылку, чтобы перейти по маршруту downloadTrack, который иногда работает и загружает файл. В других случаях выдает ошибку CORS.
В результате в журналах Heroku есть:
at = код ошибки = H10 desc = метод "Приложение упало" = путь GET = "/ track / download? Id = 7b4013b0-9550-11e9-a752-9561bb97f681" request_id = fc3945e8-af23-4c05-a432-03601ba199b5 dyno = подключиться = служба = статус = 503 байта = протокол = https
После того, как я получил одну ошибку, каждый запрос клиента, который обращается к бэкэнду, теперь будет выдавать ошибку CORS. Единственный способ заставить его снова начать работать, это перезапустить сервер Heroku, и он будет работать снова, пока внезапно не заработает.
Я не знаю, что еще попробовать. Я перебросил объект cors (), надеясь, что это поможет (мне нужно сделать это только один раз с app.use (cors ()) в app.js, насколько я могу судить). Полагаю, мой следующий шаг - попытаться разместить приложение узла в другом сервисе, кроме Heroku, и посмотреть, выполняет ли оно то же самое, чего на самом деле я бы предпочел не делать.