Heroku托管的Express中的“ App crash”和503错误响应

时间:2019-06-23 02:49:44

标签: node.js express heroku cors

有时在我的Node.js Express服务器托管在Heroku上并尝试与Netlify托管的React应用程序连接时,我有时遇到了CORS错误。我在本地运行没有任何问题(即使前端和后端是不同的URL)。

我得到:

  

从源“ https://[backend-heroku-url]”到“ https://[frontend-netlify-url]”的XMLHttpRequest的访问已被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 =“应用程序崩溃”方法=获取路径=“ / tracks / download?id = 7b4013b0-9550-11e9-a752-9561bb97f681” request_id = fc3945e8-af23-4c05-a432-03601ba199b5 dyno =连接=服务=状态= 503字节=协议= https

出现一个错误后,客户端上的每个后端请求都将引发CORS错误。我似乎可以使它再次开始工作的唯一方法是重新启动Heroku服务器,它将再次工作直到突然不起作用为止。

我对尝试其他方法一无所知。我到处都扔了cors()东西,希望对它有帮助(据我所知,我只需要用app.js中的app.use(cors())做一次)。我想我的下一步是尝试将节点应用托管在Heroku之外的其他服务上,看看它是否仍在执行相同的操作,而我宁愿不这样做。

1 个答案:

答案 0 :(得分:0)

在我的特定情况下,这似乎是由于@sideshowbarker建议的完全与CORS不相关的错误引起的。

结果证明fs.unlink()在实际完成下载之前就已运行,因此在服务器从文件中读取文件之前已将其删除。我猜这是一种竞赛状况,这就是使其变得如此不一致的原因。