在Heroku部署后,当指定localhost时React客户端因Axios失败

一月

我有一个React客户端和一个NODE.JS服务器。

客户端在端口3000上,服务器在5000上。

当我从客户端发出请求时,它看起来像这样:

import axios from "axios";
const axiosInstance = axios.create({
baseURL: "http://localhost:5000"
});

try {
const res = await axiosInstance.post("/api/myRoute", ....);

... more code 
}


catch(...) { 

}

问题是,当我将应用程序上载到Heroku时,即使我在server.js客户端也会收到404的Axios请求process.env.PORT

  const PORT = process.env.PORT || 5000;
  app.listen(PORT, () => console.log(`Server started on port ${PORT}`));

我们如何在Heroku上使用Axios而不指定localhostbaseUrl

威尔曼法典

在开发中,当您前往时,localhost:3000请访问使用create-react-app脚本启动的开发服务器npm start然后,该服务器将您应用的开发包发送到浏览器。

您还将为api启动第二台服务器localhost:5000这是您的React应用程序(现在正在浏览器中运行)向本地api请求发送的服务器。

根据您的设置,您(可能)不会在生产中运行2台服务器。相反,当api路由未处理请求(因此可能是客户端路由)时,您将让您的node / express后端提供构建文件

假设项目结构如下:

-> MyCoolApp
  -> index.js // express server
  -> client // create-react-app application
     -> src
        -> index.js
        -> setupProxy.js

首先进行设置http-proxy-middleware,以使用开发和生产中的相同方式从客户端应用向服务器发出api请求axios.get('/api/route')

// place in src with index.js no need to import anywhere
const proxy = require('http-proxy-middleware')

module.exports = function(app) {
    // add other server routes to path array
    app.use(proxy(['/api' ], { target: 'http://localhost:5000' }));
}

下一步设置服务器index.js,使其在生产/分阶段与开发中的行为有所不同(假设您使用的是express)

const express = require('express');
const app = express();

require('./routes')(app); //these are your api routes

//Non api requests in production
if (process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'staging') {
    // Add production middleware such as redirecting to https

    // Express will serve up production assets i.e. main.js
    app.use(express.static(__dirname + '/client/build'));
    // If Express doesn't recognize route serve index.html
    const path = require('path');
    app.get('*', (req, res) => {
        res.sendFile(
            path.resolve(__dirname, 'client', 'build', 'index.html')
        );
    });
}

//start server
const PORT = process.env.PORT || 5000; //Heroku sets port dynamically
app.listen(PORT, () => {
    console.log('listening...');
}).on('error', err => {
    console.log(`Error Code: ${err.code}`);
});

最后,当Heroku完成根依赖关系的安装后,它将运行一个名为的脚本heroku-postbuild,您可以指示heroku安装客户端依赖关系并构建您的生产React应用程序

在您的服务器package.json中添加/修改以下脚本:

"scripts": {
    "start": "node index.js",
    "server": "node index.js",
    "client": "npm run start --prefix client",
    "heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix client && npm run build --prefix client"
  },

这最后一部分很有用,因为Heroku基于git,并且将构建目录/文件提交给git是一种不好的做法gitignore如果您将构建目录保存在本地,请确保将构建目录添加到您的目录中!)

同样,Heroku默认情况下仅安装生产依赖项(不包含任何开发依赖项),如果这是所需的行为,则可以省略 NPM_CONFIG_PRODUCTION=false

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Servicestack客户端压缩因通用列表而失败

无法实例化 SOAP 客户端 - 因 NullPointerException 而失败

部署后如何强制客户端重新加载?

当使用go客户端部署GCP云功能时,我收到:“错误400:前提条件检查失败。

客户端可调用Firebase功能在部署到us-central1以外的区域时失败

Android Dropbox客户端因v1停用而失败

couchbase Java客户端1.2。*因Maven依赖关系而失败

Couchbase DCP 客户端 0.10.0 因 java.lang.NoSuchMethodError 失败

gRPC 客户端因“CANCELLED: io.grpc.Context was cancelled without error”而失败

贝宝客户端认证上线时失败

尝试创建客户端服务库时,wsimport失败

连接到 Google Api 客户端时连接失败

Heroku部署因缺少SQL表而失败

Heroku 部署因“缺少脚本:启动”而失败

当我运行测试套件时,它们会因PSQLException失败:FATAL:抱歉,已经有太多客户端

未指定端口时奇怪的telnet客户端行为

使用TRESTRequest时来自客户端的未指定证书

Javascript API客户端与Axios客户端

变异后React Apollo更新客户端缓存

如何部署客户端git钩子?

客户端渲染React

部署客户端后如何更新持久性Redux状态?

部署后如何立即在客户端浏览器上自动加载更改?

证书验证失败:验证证书时客户端证书验证失败

WSDL客户端呼叫失败

Netty客户端引导连接失败

OpenEJB本地客户端注入失败

组策略客户端服务失败

客户端C上的read()失败