在 Heroku 上部署 Web 应用程序后,Axios API 调用不起作用 - MERN 应用程序

Axios API calls are not working after deploying the web application on Heroku - MERN Application

在将我的代码上传到 Heroku 之前,我的 API 调用工作正常。但是,它 returns 部署后的状态代码 503 (Service Unavailable)。 这是我的代码

app.js 我的根文件夹中的文件(服务器文件)

mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true }).then(() => console.log("Connected to db!")).catch(dbErr => console.log(dbErr));

app.use(express.json());
app.use(cors());

app.post("/post-result", async (req, res) => {
    console.log(req.body.val);
    const newSurvey = new survey({ surveyValues: req.body.val });


    await newSurvey.save()
        .then(data => {
            res.send(newSurvey);
            console.log(newSurvey);
        }).catch(err => console.log(err));
});

app.get("/results", async (req, res) => {
    const result = await survey.find({});
    res.send(result);
});

if (process.env.NODE_ENV === "production") {
    app.use(express.static(path.join(__dirname, "/client/build")));
    app.get("*", (req, res) => {
        res.sendFile(path.join(__dirname, "client", "build", "index.html"));
    })
} else {
    app.get("/", (req, res) => {
        res.send("API running");
    })
}

app.listen(process.env.PORT, () => console.log("Listening on PORT 8080"));

我的反应文件,其中 API 调用

const handleFormSubmit = async (e, val) => {
    const { data } = await Axios.post("/post-result", { val });
}

package.json 文件

{
  "scripts": {
    "start": "nodemon app.js",
    "heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix client && npm run build --prefix client"
  },
  "dependencies": {
    "cors": "^2.8.5",
    "dotenv": "^10.0.0",
    "express": "^4.17.1",
    "mongoose": "^6.0.12"
  }
}

控制台报错 Uncaught (in promise) Error: Request failed with status code 503 at e.exports createError.js:16) at e.exports (settle.js:17) at XMLHttpRequest.S (xhr.js:66)

选项 1:

也许你应该尝试使用所有 url 而不是 Axios.post("/post-result",{..}) 你可以使用局部变量来确定你是否在 Prod 或本地环境中,在 util 文件夹中创建一个名为 baseUrl.js :

的文件
 const baseUrl = process.env.NODE_ENV === "production"
    ? "https://[your url used in port]"
    : "http://localhost:[your port]";
export default baseUrl;

然后在您的文件夹中导入 baseUrl 并将您的 Axios 请求替换为:

 const { data } = await Axios.post(baseUrl + "/post-result", { val });

选项 2:

我还注意到您不允许在 Cors 选项中使用任何 URL :

let corsOptions = {
  origin: ["URL ALLOWED", ...],
};

app.use(cors(corsOptions));