«Приложение упало» и сообщение об ошибке 503 от Express, размещенного на Heroku - PullRequest
0 голосов
/ 23 июня 2019

У меня возникают ошибки 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, и посмотреть, выполняет ли оно то же самое, чего на самом деле я бы предпочел не делать.

1 Ответ

0 голосов
/ 24 июня 2019

В моем конкретном случае это, по-видимому, было вызвано совершенно не связанной с CORS ошибкой, как предложил @sideshowbarker.

Оказывается, fs.unlink () работал до того, как загрузка фактически закончилась, поэтому файл удалялся до того, как сервер завершил чтение с него. Я предполагаю, что это было состояние гонки, из-за чего оно было настолько непоследовательным.

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