当我使用 React.js 在 Heroku 中使用 Axios 执行 GET 请求时,我应该使用哪个基本 url

Posted

技术标签:

【中文标题】当我使用 React.js 在 Heroku 中使用 Axios 执行 GET 请求时,我应该使用哪个基本 url【英文标题】:Which base url should I use when I perform GET request with Axios in Heroku with React.js 【发布时间】:2021-04-12 15:21:00 【问题描述】:

我正在使用 MERN 堆栈应用程序。当我在本地运行此应用程序时,它可以完美运行,但我不确定为什么当我在 Heroku 中运行我的应用程序时,我的 Axios 获取请求在我的 React 组件中不起作用。

在这段代码中,Axios get 调用返回给我一个普通的 html 对象。

import  useState, useEffect from "react";
const axios = require('axios').default;

function MyReactComponent() 

    const [data, setData] = useState([]);

    useEffect(() => 

        axios.get("/api/standings").then(response => 
            const myData = response.data

            console.log(myData);

            //logs a plain html object working in heroku
        );

    , []);

    return (
        <div>
            <h1>Hello, this is an example</h1>
        </div>
    )


export default MyReactComponent;

当我使用 Promise 执行此操作时,它会记录未定义:

import  useState, useEffect  from "react";
const axios = require('axios').default;

function MyReactComponent() 

    useEffect(() => 

        const [data, setData] = useState([]);

        return new Promise((resolve, reject) => 
            axios
                .get("/api/standings")
                .then(res => 
                    resolve(res.data)
                    console.log(resolve(res.data))

                    //logs undefined working in heroku
                , err => reject(err));
        );
    );

    return (
        <div>
            <h1>Hello, this is an example</h1>
        </div>
    )


export default MyReactComponent;

我必须指出,在本地工作我必须在我的前端文件夹中的“package.json”中使用代理,以使 Axios 执行请求而不会出现 404 错误:

"proxy": "http://localhost:4000"

我知道如果我在执行 Axios 调用时输入“/ANYTHINGELSE”,则基本 URL 是“https://appname.herokuapp.com”。那我该怎么办?

【问题讨论】:

您是否尝试在不使用“.default”的情况下导入? 是的,我试过不使用“.default”并像“import axios from 'axios'”一样导入。没有任何变化 那么如果你在本地主机上使用代理,你应该使用this link提供的axios初始化不记名令牌,以免得到未经授权的响应。 谢谢,但我在正常请求的任何部分都没有使用不记名令牌,所以如果我尝试将该代码添加到我的 JS 文件中,则未定义令牌。我已经尝试按照您告诉我的方式查找其他帖子,但这对我不起作用。我真的不明白,我看过很多人和我一样的视频,他们用 axios 从他们的数据库中获取数据没有问题 很明显它与 axios 本身无关,但不可能从你的 repo 和背景之外进行调试 【参考方案1】:

我已经解决了,不是axios问题,更不是前端问题。

在我的后端,定义我的服务器的 index.js 文件是这样的:


require("dotenv").config();
const express = require("express");
const app = express();
var cors = require('cors')
const path = require('path');
const bodyParser = require("body-parser");
const mongoose = require("mongoose");


//SETTINGS
app.use(cors());
app.set("port", process.env.PORT || 4000);

.
. //ETC
.

//THEN, Defining what front-end should show if heroku is on production

if (process.env.NODE_ENV === 'production') 
    app.use(express.static(path.join(__dirname, '../../frontend/build')));
    app.get('*', (req, res) => 
        res.sendFile(path.join(__dirname, '../../frontend/build/index.html'));
    )

//And then my server routes...

//ROUTES
app.use("/api/standings", require("./routes/standings"));
app.use("/api/races", require("./routes/races"));
app.use("/api/f1datas", require("./routes/f1datas"));


.
.//More code
.

这最后的部分应该被交换

//ROUTES
app.use("/api/standings", require("./routes/standings"));
app.use("/api/races", require("./routes/races"));
app.use("/api/f1datas", require("./routes/f1datas"));

//THEN

if (process.env.NODE_ENV === 'production') 
    app.use(express.static(path.join(__dirname, '../../frontend/build')));
    app.get('*', (req, res) => 
        res.sendFile(path.join(__dirname, '../../frontend/build/index.html'));
    )

【讨论】:

以上是关于当我使用 React.js 在 Heroku 中使用 Axios 执行 GET 请求时,我应该使用哪个基本 url的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React.Js 内部渲染中使链接可点击?

如果所有三个容器都是使用一种方法呈现的,我怎样才能在 Dragula 中使所有三个容器都可拖动?使用 React js 和 Dragula(不是 react-dragula)

尝试将 react.js 应用程序部署到 heroku 时出错

如何将带有 django 的 react.js webpack 部署到 heroku?

TypeError:无法读取未定义的属性“长度”(React,heroku)

react-scripts 构建“第 1 行解析错误”