在heroku上部署Nodejs+Express+React+Webpack应用

Posted

技术标签:

【中文标题】在heroku上部署Nodejs+Express+React+Webpack应用【英文标题】:Deploy Nodejs+Express+React+Webpack app on heroku 【发布时间】:2019-04-09 15:21:13 【问题描述】:

我已经使用 node js、express、webpack、react 和 socket io 制作了一个 web 应用程序,我想将它部署在 heroku 上。当我尝试它时,我可以访问该网站,但它显示了一条错误消息:

无法获取/

这是我的配置:

    "scripts": 
    "start": "npm run dev",
    "build": "webpack --mode production",
    "client": "webpack-dev-server --mode development --devtool inline-source-map --hot",
    "server": "nodemon src/server/index.js",
    "dev": "concurrently \"npm run server\" \"npm run client\"",
    "heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install && npm run build"
  

在我更改之前启动脚本是node src/server/index.js,因为我运行npm run dev 以在本地启动我的应用程序。

这是我的存储库:http://git.kamal-allali.fr/kamal/prog_web_5a

这里是heroku链接:https://fast-earth-60949.herokuapp.com

这里是heroku日志:

2018-11-05T21:42:44.984679+00:00 app[web.1]:1 建于:11/05/2018 9:42:44 PM

2018-11-05T21:42:44.984681+00:00 app[web.1]: 1 Asset 大小块块名称

2018-11-05T21:42:44.984683+00:00 app[web.1]:1bundle.js 7.42 MiB main [发出] main

2018-11-05T21:42:44.984685+00:00 应用[web.1]:1favicon.ico 40.4 KiB [发射]

2018-11-05T21:42:44.984686+00:00 应用[web.1]:1index.html 717 字节[发出]

2018-11-05T21:42:44.984688+00:00 app[web.1]: 1 入口点主 = bundle.js

2018-11-05T21:42:44.984710+00:00 应用[web.1]:1 [./node_modules/loglevel/lib/loglevel.js] 7.68 KiB main [内置]

2018-11-05T21:42:44.984712+00:00 应用[web.1]:1 [./node_modules/react-dom/index.js] 1.33 KiB main [内置]

2018-11-05T21:42:44.984713+00:00 应用[web.1]:1 [./node_modules/react/index.js] 190 字节 main [内置] 2018-11-05T21:42:44.984715+00:00 应用[web.1]:1 [./node_modules/url/url.js] 22.8 KiB main [内置]

2018-11-05T21:42:44.984718+00:00 应用[web.1]:1 [./node_modules/webpack-dev-server/client/index.js?http://localhost:3000] (webpack)-dev-server/client?http://localhost:3000 7.78 KiB main [建成]

2018-11-05T21:42:44.984720+00:00 应用[web.1]:1 [./node_modules/webpack-dev-server/client/overlay.js] (webpack)-dev-server/client/overlay.js 3.58 KiB main [内置]

2018-11-05T21:42:44.984723+00:00 app[web.1]:1[0] 多 (webpack)-dev-server/client?http://localhost:3000 (webpack)/hot/dev-server.js ./src/client/index.js 52 字节 main [建成]

2018-11-05T21:42:44.984724+00:00 应用[web.1]:1 [./node_modules/webpack-dev-server/client/socket.js] (webpack)-dev-server/client/socket.js 1.05 KiB main [内置]

2018-11-05T21:42:44.984726+00:00 应用[web.1]:1 [./node_modules/webpack-dev-server/node_modules/strip-ansi/index.js] (webpack)-dev-server/node_modules/strip-ansi/index.js 161 字节 main [建成]

2018-11-05T21:42:44.984728+00:00 应用[web.1]:1 [./node_modules/webpack/热同步 ^./log$] (webpack)/热同步 非递归 ^./log$ 170 字节 main [内置]

2018-11-05T21:42:44.984730+00:00 应用[web.1]:1 [./node_modules/webpack/hot/dev-server.js] (webpack)/hot/dev-server.js 1.61 KiB main [内置]

2018-11-05T21:42:44.984732+00:00 应用[web.1]:1 [./node_modules/webpack/hot/emitter.js] (webpack)/hot/emitter.js 75 字节 main [内置]

2018-11-05T21:42:44.984733+00:00 应用[web.1]:1 [./node_modules/webpack/hot/log-apply-result.js] (webpack)/hot/log-apply-result.js 1.27 KiB main [内置]

2018-11-05T21:42:44.984735+00:00 应用[web.1]:1 [./src/client/Layout.js] 4.33 KiB main [内置]

2018-11-05T21:42:44.984736+00:00 应用[web.1]:1 [./src/client/index.js] 205 字节 main [内置]

2018-11-05T21:42:44.984738+00:00 app[web.1]: 1 + 349 隐藏 模块

2018-11-05T21:42:44.984740+00:00 app[web.1]: 1 Child “index.html”的 html-webpack-plugin:

2018-11-05T21:42:44.984742+00:00 app[web.1]: 1 1 个资产

2018-11-05T21:42:44.984743+00:00 app[web.1]: 1 入口点 未定义 = index.html

2018-11-05T21:42:44.984745+00:00 应用[web.1]:1 [./node_modules/html-webpack-plugin/lib/loader.js!./public/index.html] 828 字节 0 [内置]

2018-11-05T21:42:44.984746+00:00 应用[web.1]:1 [./node_modules/lodash/lodash.js] 527 KiB 0 [内置]2018-11-05T21:42:44.984748+00:00 应用[web.1]:1 [./node_modules/webpack/buildin/global.js] (webpack)/buildin/global.js 489 字节 0 [内置]

2018-11-05T21:42:44.984749+00:00 应用[web.1]:1 [./node_modules/webpack/buildin/module.js] (webpack)/buildin/module.js 497 字节 0 [内置]

2018-11-05T21:42:44.984751+00:00 app[web.1]:1ℹ「wdm」:已编译 成功。

2018-11-05T22:16:20.551630+00:00 heroku[web.1]:空闲

2018-11-05T22:16:20.552092+00:00 heroku[web.1]:状态从上改变 向下

2018-11-05T22:16:21.411951+00:00 heroku[web.1]:停止所有进程 带 SIGTERM

2018-11-05T22:16:21.808625+00:00 heroku[web.1]:进程退出 状态 143

2018-11-06T08:35:42.000000+00:00 app[api]:构建由用户启动 kamal.allali@outlook.fr

2018-11-06T08:36:36.888512+00:00 heroku[web.1]:状态从 开始

2018-11-06T08:36:36.713630+00:00 app[api]:由用户部署 d62783d3 kamal.allali@outlook.fr

2018-11-06T08:36:36.713630+00:00 app[api]:用户创建的版本 v12 kamal.allali@outlook.fr

2018-11-06T08:36:40.000000+00:00 app[api]:构建成功

2018-11-06T08:36:42.010068+00:00 heroku[web.1]:启动过程 命令npm start

2018-11-06T08:36:45.324322+00:00 应用[web.1]:

2018-11-06T08:36:45.324353+00:00 app[web.1]: > projet-web-5a@1.0.0 启动 /app

2018-11-06T08:36:45.324355+00:00 app[web.1]: > npm run dev

2018-11-06T08:36:45.324356+00:00 应用[web.1]:

2018-11-06T08:36:45.753063+00:00 应用[web.1]:

2018-11-06T08:36:45.753112+00:00 app[web.1]: > projet-web-5a@1.0.0 dev /应用程序

2018-11-06T08:36:45.753114+00:00 app[web.1]: > 同时“npm run 服务器”“npm 运行客户端”

2018-11-06T08:36:45.753116+00:00 应用[web.1]:

2018-11-06T08:36:47.147860+00:00 应用[web.1]:1

2018-11-06T08:36:47.147877+00:00 app[web.1]:1 > projet-web-5a@1.0.0 客户端/应用程序

2018-11-06T08:36:47.147879+00:00 app[web.1]: 1 > webpack-dev-server --mode development --devtool inline-source-map --hot

2018-11-06T08:36:47.147881+00:00 应用[web.1]:1

2018-11-06T08:36:47.172481+00:00 应用[web.1]: [0]

2018-11-06T08:36:47.172485+00:00 app[web.1]: [0] > projet-web-5a@1.0.0 服务器/应用程序

2018-11-06T08:36:47.172487+00:00 应用程序 [web.1]: [0] > nodemon src/server/index.js

2018-11-06T08:36:47.172488+00:00 应用[web.1]: [0]

2018-11-06T08:36:47.672353+00:00 app[web.1]: [0] [nodemon] 1.18.4

2018-11-06T08:36:47.673281+00:00 app[web.1]:[0] [nodemon] 重启 随时输入rs

2018-11-06T08:36:47.673747+00:00 app[web.1]: [0] [nodemon] 观看: /app/src/server/**/*

2018-11-06T08:36:47.674424+00:00 app[web.1]: [0] [nodemon] 开始 node src/server/index.js

2018-11-06T08:36:47.963706+00:00 app[web.1]: [0] 监听端口 45437

2018-11-06T08:36:48.299567+00:00 heroku[web.1]:状态从 开始了

2018-11-06T08:36:48.679674+00:00 app[web.1]: 1 clean-webpack-plugin: /app/dist 已被删除。

2018-11-06T08:36:48.905698+00:00 app[web.1]:1ℹ「wds」:项目是 运行在http://localhost:3000/

2018-11-06T08:36:48.906031+00:00 app[web.1]:1ℹ「wds」:webpack 输出来自 /

2018-11-06T08:36:48.956210+00:00 app[web.1]:1⚠「wds」:无法 打开浏览器。如果您在无头环境中运行,请执行 不使用 --open 标志

2018-11-06T08:36:55.276089+00:00 heroku[路由器]: at=info method=GET path="/" 主机=fast-earth-60949.herokuapp.com request_id=2474b83b-65ce-43b4-a54f-6851d5f55a7c fwd="78.112.168.129" dyno=web.1 连接=0ms 服务=9ms 状态=404 字节=360 协议=https

2018-11-06T08:36:57.303048+00:00 app[web.1]:1ℹ「wdm」: Hash: 6de9947fac0c16b70883

2018-11-06T08:36:57.303058+00:00 app[web.1]: 1 版本: webpack 4.19.1

2018-11-06T08:36:57.303061+00:00 app[web.1]:1 时间:8512ms

2018-11-06T08:36:57.303063+00:00 app[web.1]: 1 建于:11/06/2018 上午 8 点 36 分 57 秒

2018-11-06T08:36:57.303066+00:00 app[web.1]: 1 Asset 大小块块名称

2018-11-06T08:36:57.303069+00:00 应用[web.1]:1bundle.js 7.42 MiB main [发出] main

2018-11-06T08:36:57.303071+00:00 应用[web.1]:1favicon.ico 40.4 KiB [发射]

2018-11-06T08:36:57.303073+00:00 应用[web.1]:1index.html 717 字节[发出]

2018-11-06T08:36:57.303074+00:00 app[web.1]: 1 入口点主 = bundle.js

2018-11-06T08:36:57.303077+00:00 应用[web.1]:1 [./node_modules/loglevel/lib/loglevel.js] 7.68 KiB main [内置]

2018-11-06T08:36:57.303078+00:00 应用[web.1]:1 [./node_modules/react-dom/index.js] 1.33 KiB main [内置]

2018-11-06T08:36:57.303080+00:00 应用[web.1]:1 [./node_modules/react/index.js] 190 字节 main [内置] 2018-11-06T08:36:57.303082+00:00 应用[web.1]:1 [./node_modules/url/url.js] 22.8 KiB main [内置]

2018-11-06T08:36:57.303084+00:00 应用[web.1]:1 [./node_modules/webpack-dev-server/client/index.js?http://localhost:3000] (webpack)-dev-server/client?http://localhost:3000 7.78 KiB main [建成]

2018-11-06T08:36:57.303087+00:00 应用[web.1]:1 [./node_modules/webpack-dev-server/client/overlay.js] (webpack)-dev-server/client/overlay.js 3.58 KiB main [内置]

2018-11-06T08:36:57.303090+00:00 app[web.1]:1[0] 多 (webpack)-dev-server/client?http://localhost:3000 (webpack)/hot/dev-server.js ./src/client/index.js 52 字节 main [建成]

2018-11-06T08:36:57.303091+00:00 应用[web.1]:1 [./node_modules/webpack-dev-server/client/socket.js] (webpack)-dev-server/client/socket.js 1.05 KiB main [内置]

2018-11-06T08:36:57.303093+00:00 应用[web.1]:1 [./node_modules/webpack-dev-server/node_modules/strip-ansi/index.js] (webpack)-dev-server/node_modules/strip-ansi/index.js 161 字节 main [建成]

2018-11-06T08:36:57.303095+00:00 应用[web.1]:1 [./node_modules/webpack/热同步 ^./log$] (webpack)/热同步 非递归 ^./log$ 170 字节 main [内置]

2018-11-06T08:36:57.303099+00:00 应用[web.1]:1 [./node_modules/webpack/hot/dev-server.js] (webpack)/hot/dev-server.js 1.61 KiB main [内置]

2018-11-06T08:36:57.303100+00:00 应用[web.1]:1 [./node_modules/webpack/hot/emitter.js] (webpack)/hot/emitter.js 75 字节 main [内置]

2018-11-06T08:36:57.303102+00:00 应用[web.1]:1 [./node_modules/webpack/hot/log-apply-result.js] (webpack)/hot/log-apply-result.js 1.27 KiB main [内置]

2018-11-06T08:36:57.303104+00:00 应用[web.1]:1 [./src/client/Layout.js] 4.33 KiB main [内置]

2018-11-06T08:36:57.303106+00:00 应用[web.1]:1 [./src/client/index.js] 205 字节 main [内置]

2018-11-06T08:36:57.303108+00:00 app[web.1]: 1 + 349 隐藏 模块

2018-11-06T08:36:57.303109+00:00 app[web.1]: 1 Child “index.html”的 html-webpack-plugin:

2018-11-06T08:36:57.303111+00:00 app[web.1]: 1 1 个资产

2018-11-06T08:36:57.303113+00:00 app[web.1]:1入口点 未定义 = index.html

2018-11-06T08:36:57.303115+00:00 应用[web.1]:1 [./node_modules/html-webpack-plugin/lib/loader.js!./public/index.html] 828 字节 0 [内置]

2018-11-06T08:36:57.303116+00:00 应用[web.1]:1 [./node_modules/lodash/lodash.js] 527 KiB 0 [内置]2018-11-06T08:36:57.303118+00:00 应用[web.1]:1 [./node_modules/webpack/buildin/global.js] (webpack)/buildin/global.js 489 字节 0 [内置]

2018-11-06T08:36:57.303119+00:00 应用[web.1]:1 [./node_modules/webpack/buildin/module.js] (webpack)/buildin/module.js 497 字节 0 [内置]

2018-11-06T08:36:57.303457+00:00 app[web.1]:1ℹ「wdm」:已编译 成功。

【问题讨论】:

您可以将heroku 日志添加到您的问题中吗?如果可能,指向您的网络应用程序的链接也会有所帮助。 所以我首先注意到您的文件组织。你能解释一下你是如何开始这个项目的吗?为什么src 中有 Node 和 React 的东西?你不是先在根文件夹中启动后端,然后为create-react-app 工作添加一个client 文件夹吗?请解释。 client 文件夹应该有自己的 package.json 文件。 我使用了以下教程:github.com/vlw0052/Tutorial---ReactJS-and-Socket.io-Chat-App 【参考方案1】:

您需要将您的节点版本添加到您的package.json

示例:

  "engines": 
    "node": "10.11.0"
  

我在 cmets 中回答了,但这不是最好的方法,所以我会在这里编辑。

由于您尝试提供静态内容,请尝试使用静态中间件。

删除

app.get('*', (req,res) =>
    res.sendFile(path.join(__dirname,'../../public/index.html'));
);

并添加

app.use(express.static(path.join(__dirname,'../../public')));

第二次编辑。

您需要构建项目并提供文件夹,通常是 dist 或 build 文件夹。

为此,您有两种选择,一种是在将更改发布到 heroku 之前构建项目,但这可能会有点乏味。

另一个选项是执行安装后脚本,以便在 heroku 执行 npm install 后构建项目,并使用最新更改创建 dist 或 build 文件夹。

"postinstall": "npm run build"

如果您不希望每次执行 npm install 时都运行脚本,您可以在 heroku 中使用 if-env 和环境变量。

"postinstall": "if-env NODE_ENV=production && npm run build"

一旦您知道在构建时创建了哪个文件夹,请更改下一行。

app.use(express.static(path.join(__dirname,'path to the folder with the prod build')));

【讨论】:

我在 package.json 中添加了这些行,但结果仍然相同 它不再向我显示错误,但我有一个空白页。它没有显示我的 React 组件 我的错,我以为你使用 public 作为你的构建文件夹。我更新了帖子以澄清。我会在此处为您提供一个指向我在帖子中解释的存储库的链接。 github.com/rmartide/vue-playground 服务器在 src/server. npm run build 创建了一个 dist 文件夹,但是当我在 heroku 上尝试它时,它告诉我 Not found。当我进入 heroku 控制台并输入 ls 时,我可以看到 dist 文件夹。 您可以尝试构建项目,然后使用创建的 dist 文件夹将其推送到 heroku,看看它是否有效。然后在安装后将其细化为自动构建或类似的东西。确保文件夹的路径正确,也许就是这样。首先在 localhost 上进行测试以确保。【参考方案2】:

如果没有 Heroku 日志,这有点像猜测......但是

Cannot GET / - 表示 express 没有响应路径..

Heroku 正在使用 express 为 NodeJs 提供服务,这就是错误所在

通过检查 server/index.js 中的代码,您正在使用 path 包并忘记导入它:)

const path = require('path');

一旦你解决了这个问题,你还需要添加一个条件来到达 DIST 文件夹而不是公开的(因为你将提供 DIST 文件夹)

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

*同时检查 dist 正在加载并且不在 .gitignore

祝你好运!

【讨论】:

以上是关于在heroku上部署Nodejs+Express+React+Webpack应用的主要内容,如果未能解决你的问题,请参考以下文章

端口 34037 已在使用 Heroku + Nodejs + Express + WebSockets

如何将 Typescript、NodeJS 和 Express 应用程序部署到 Heroku

在 heroku 上部署 MERN 会导致意外错误

Heroku 无法在 nodejs 的 express-router 上拥有从“@”开始的路由

使用angular 9部署在heroku上的nodejs应用程序中的CORS错误

Heroku 应用程序 EACCES 上的 Nodejs Express 0.0.0.0:80