有时在我的Node.js Express服务器托管在Heroku上并尝试与Netlify托管的React应用程序连接时,我有时遇到了CORS错误。我在本地运行没有任何问题(即使前端和后端是不同的URL)。
我得到:
从源“ https://[backend-heroku-url]”到“ https://[frontend-netlify-url]”的XMLHttpRequest的访问已被CORS策略阻止:所请求的资源上没有“ Access-Control-Allow-Origin”标头
。
我使用的是'cors'npm软件包,默认情况下应允许所有操作。
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, () => {});
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;
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);
}
});
};
<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之外的其他服务上,看看它是否仍在执行相同的操作,而我宁愿不这样做。
答案 0 :(得分:0)
在我的特定情况下,这似乎是由于@sideshowbarker建议的完全与CORS不相关的错误引起的。
结果证明fs.unlink()在实际完成下载之前就已运行,因此在服务器从文件中读取文件之前已将其删除。我猜这是一种竞赛状况,这就是使其变得如此不一致的原因。