主机提供商 Heroku 似乎没有在 "npm run start" 中获取并发命令

Host Provider Heroku doesn't seem to pick up concurrently command in "npm run start"

堆栈溢出问题

Host Provider Heroku 似乎没有在“npm 运行 start”中获取并发命令。我可以让这个启动命令与“heroku local web”一起工作,但是当 运行 在 heroku 主机上执行相同的操作时,会出现以下日志错误。 我注意到对于其他一些节点全栈项目,后端在启动时设置为 运行。在这些情况下,在 express 中有路由设置,以便请求路由到后端路由或传递到静态前端页面。我的问题是我没有表达支持这一点。我只是 运行 宁 json-server 在后端(或尝试)和我的 vue.js 内容在前面。

是否有变通办法将 Heroku 配置为同时启动前端和后端服务器?

我可以在本地 运行 “npm 运行 启动”,但不能在 Heroku 上: 似乎 Heroku(至少在默认情况下)配置为通过 运行ning“npm 运行 start”启动节点应用程序。结果,我的 package.json 中有以下条目:

package.json

"start": "concurrently \"export NODE_ENV=production\" \"json-server --watch db.json\" \"vue-cli-service serve --mode production\""

Heroku 日志:

2021-10-17T18:30:52.000000+00:00 app[api]: Build succeeded
2021-10-17T18:30:54.001782+00:00 heroku[web.1]: Starting process with command `npm start`
2021-10-17T18:30:55.002829+00:00 app[web.1]:
2021-10-17T18:30:55.002845+00:00 app[web.1]: > my-vue-app@0.1.0 start /app
2021-10-17T18:30:55.002845+00:00 app[web.1]: > concurrently "export NODE_ENV=production" "json-server --watch db.json" "vue-cli-service serve --mode production"
2021-10-17T18:30:55.002846+00:00 app[web.1]:
2021-10-17T18:30:55.226381+00:00 app[web.1]: [1] /bin/sh: 1: json-server: not found
2021-10-17T18:30:55.227075+00:00 app[web.1]: [2] /bin/sh: 1: vue-cli-service: not found
2021-10-17T18:30:55.228104+00:00 app[web.1]: [2] vue-cli-service serve --mode production exited with code 1272021-10-17T18:30:55.228540+00:00 app[web.1]: [1] json-server --watch db.json exited with code 127
2021-10-17T18:30:55.228781+00:00 app[web.1]: [0] export NODE_ENV=production exited with code 0
2021-10-17T18:30:55.238234+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2021-10-17T18:30:55.238413+00:00 app[web.1]: npm ERR! errno 1
2021-10-17T18:30:55.242355+00:00 app[web.1]: npm ERR! my-vue-app@0.1.0 start: `concurrently "export NODE_ENV=production" "json-server --watch db.json" "vue-cli-service serve --mode production"`
2021-10-17T18:30:55.242419+00:00 app[web.1]: npm ERR! Exit status 1
2021-10-17T18:30:55.242477+00:00 app[web.1]: npm ERR!
2021-10-17T18:30:55.242529+00:00 app[web.1]: npm ERR! Failed at the my-vue-app@0.1.0 start script.
2021-10-17T18:30:55.242567+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2021-10-17T18:30:55.248113+00:00 app[web.1]:
2021-10-17T18:30:55.248206+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
2021-10-17T18:30:55.248255+00:00 app[web.1]: npm ERR!     /app/.npm/_logs/2021-10-17T18_30_55_242Z-debug.log 
2021-10-17T18:30:55.386385+00:00 heroku[web.1]: Process exited with status 1
2021-10-17T18:30:55.642820+00:00 heroku[web.1]: State changed from starting to crashed
2021-10-17T18:30:59.838564+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=myvueapp1.herokuapp.com request_id=eaa81f4f-8d66-4dcc-92e6-5ac730cf9c9c fwd="73.181.221.158" dyno= connect= service= status=503 bytes= protocol=https
2021-10-17T18:31:00.272840+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=myvueapp1.herokuapp.com request_id=a3108da6-5ba3-48cf-8bc4-4b5784a6d171 fwd="73.181.221.158" dyno= connect= service= status=503 bytes= protocol=https
2021-10-17T18:32:51.000000+00:00 app[api]: Build started by user mark.johnson.
2021-10-17T18:33:54.181436+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=myvueapp1.herokuapp.com request_id=91cd8f28-f155-4b58-b4ac-bb1539e06413 fwd="73.181.221.158" dyno= connect= service= status=503 bytes= protocol=https
2021-10-17T18:33:54.362762+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=myvueapp1.herokuapp.com request_id=8103d63b-9a7d-46f9-b2c1-5d662e77b539 fwd="73.181.221.158" dyno= connect= service= status=503 bytes= protocol=https
2021-10-17T18:34:35.091986+00:00 heroku[web.1]: State changed from crashed to starting
2021-10-17T18:34:34.685663+00:00 app[api]: Deploy 6abb4c8b by user mark.johnson.
2021-10-17T18:34:34.685663+00:00 app[api]: Release v4 created by user mark.johnson.
2021-10-17T18:34:38.788809+00:00 heroku[web.1]: Starting process with command `npm start`
2021-10-17T18:34:41.024848+00:00 app[web.1]: 
2021-10-17T18:34:41.024866+00:00 app[web.1]: > my-vue-app@0.1.0 start /app
2021-10-17T18:34:41.024866+00:00 app[web.1]: > concurrently "export NODE_ENV=production" "json-server --watch db.json" "vue-cli-service serve --mode production"
2021-10-17T18:34:41.024867+00:00 app[web.1]:
2021-10-17T18:34:41.548998+00:00 app[web.1]: [1]   Done
2021-10-17T18:34:41.555274+00:00 app[web.1]: [1]
2021-10-17T18:34:41.555534+00:00 app[web.1]: [1]   Resources
2021-10-17T18:34:41.555535+00:00 app[web.1]: [1]   http://localhost:3000/table1
2021-10-17T18:34:41.555535+00:00 app[web.1]: [1]   http://localhost:3000/table2
2021-10-17T18:34:41.555535+00:00 app[web.1]: [1]
2021-10-17T18:34:41.555536+00:00 app[web.1]: [1]   Home
2021-10-17T18:34:41.555536+00:00 app[web.1]: [1]   http://localhost:3000
2021-10-17T18:34:41.555536+00:00 app[web.1]: [1]
2021-10-17T18:34:41.555781+00:00 app[web.1]: [1]   Type s + enter at any time to create a snapshot of the database

正如我所说 and ,企业架构中的常见方法是通过存储库和服务器拥有一个应用程序。

想象一下,您的微服务 (json) 进程需要更多内存,因为它要处理繁重的操作,而且由于您的网络是一个水疗中心,所以不需要任何东西,因为它只是 npm run build 之后的静态文件.在这种情况下,根据基础架构,您可以轻松扩展 vertically/horizontally 每个工件(api 和 Web)。如果您在同一台服务器上有多个进程,您将备份到 monolithic architecture。这只是以下几个优点之一:

Api 和网络

在 heroku 和任何平台中,应用程序都有自己的端口。您还会注意到在您的开发人员笔记本电脑中:

如您所见,这里有两个应用程序,每个应用程序都有自己的端口。将来,每个人都会有自己的域名:acme.com 和 acme-api.com

仅供测试

使用 json-server 将单个文件 (db.json) 发布为微服务或 rest api 仅用于测试或 poc 目的。在真实用户的真实应用程序中同时使用 会很疯狂。

我在早期开发阶段使用了它,当时 api/microservice 还不存在。

当 api 准备好使用并在自己的服务器上提供自己的 http 域 (http://acme-api.com) 时,我在我的网站上设置了这个新的 url。

两个应用程序(api + 网络)

如果您不想复杂化并为真正的企业部署做好准备,您应该在您的 heroku 帐户上创建两个不同的应用程序

  • acme-web 用你的 vue 代码。这通常需要有npm run devnpm run buildnpm run start。您的启动脚本应该是这样的:"start": "vue-cli-service serve --mode production"
  • acme-api 与您真正的 api/microservice 源代码(数据库连接和其他功能)。同样在早期阶段(api 还不存在)你可以把你的 db.json 放在这里,你的启动脚本应该是这样的:"start": "json-server --watch db.json"

一个应用程序

无论如何,如果你想或需要在一个服务器或容器中拥有所有 (web+api),你应该使用另一个供应商,如 aws、gcp、azure 等。在那个供应商上你的 同时命令将起作用。

在 heroku 上,你不能 运行 同一个 dyno 上的两个不同的网络进程。

解决方法

由于某些框架确实像 MEAN、MERN 和 MEVN 以及其他现代单体,您可以使用快速服务器来为您的 api 和您的网站提供服务。

此应用应如下所示:

var express = require('express');
var jsonServer = require('json-server');

var app = express();

//publish the static result of npm run build (vue)
//https://github.com/jrichardsz/nodejs-express-snippets/tree/master/simple-static-server
app.use('/',
  express.static(path.join(__dirname, "site" || proces.env.SITE_FOLDER)),
);

//run json-server programmatically here
//https://github.com/typicode/json-server/issues/253#issuecomment-205509836
app.use('/api', jsonServer.router('db.json'));

app.listen(3000);

环境变量

如果您选择高级分布式架构,并且您至少有两个环境:测试和生产,并且您不想在将应用程序从笔记本电脑切换到下一个环境时不时更改变量dev > testing > production 您需要使用 heroku 管理器正确处理您的环境变量。