简体   繁体   English

我多次尝试在 Heroku 上部署我的 Express.js 应用程序,但我收到“应用程序错误”

[英]I tried to deploy my Express.js app on Heroku so many times and I get "Application error"

I wanna deploy my Expree.js "Blogging-website" project on Heroku, But after trying soo many times I'm getting "Application error" that your app has been crashed "H10".我想在 Heroku 上部署我的 Expree.js“博客网站”项目,但是在尝试了很多次之后,我收到“应用程序错误”,您的应用程序已经崩溃“H10”。 This is package.json file.这是 package.json 文件。 I followed all the steps, please let me know if I've missed anything:我遵循了所有步骤,如果我遗漏了什么,请告诉我:

{
  "name": "ejs-challenge",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
 },
  "repository": {
    "type": "git",
    "url": "git@github.com:soniiya/Blogging-final.git"
  },
  "author": "",
  "license": "ISC",
  "engines": {
    "node": "14.17.6"
  },

And also added this in my app.js file:并且还在我的 app.js 文件中添加了这个:

app.listen(process.env.PORT || 3000, function () {
  console.log("Server started on port 3000");
});

I've created Procfile too "web: node app.js".我也创建了 Procfile “web: node app.js”。 Actually when I deployed the same app without User Authentication feature, it deployed successfully but when added authentication it's crashing now.实际上,当我部署没有用户身份验证功能的同一个应用程序时,它部署成功,但是当添加身份验证时,它现在崩溃了。 I used MongoDB for database, If you have any suggestions then please let me know.我使用 MongoDB 作为数据库,如果您有任何建议,请告诉我。 What can cause "App crashed" on heroku?什么会导致 heroku 上的“应用程序崩溃”?

This is the "heroku logs":

$ heroku logs --app agile-journey-27742
 »   Warning: heroku update available from 7.53.0 to
 »   7.59.2.
2021-12-25T15:01:48.138120+00:00 app[api]: Release v4 created by user soniyajaiswal995@gmail.com
2021-12-25T15:01:48.138120+00:00 app[api]: Set DB_PATH config vars by user soniyajaiswal995@gmail.com
2021-12-25T15:01:48.343377+00:00 heroku[web.1]: State changed from crashed to starting
2021-12-25T15:01:51.169675+00:00 heroku[web.1]: Starting process with command `node app.js`
2021-12-25T15:01:52.431858+00:00 app[web.1]: Sat, 25 Dec 2021 15:01:52 GMT express-session deprecated req.secret; provide secret option at app.js:50:9
2021-12-25T15:01:52.432471+00:00 app[web.1]: Warning: connect.session() MemoryStore is not
2021-12-25T15:01:52.432472+00:00 app[web.1]: designed for a production environment, as it will leak
2021-12-25T15:01:52.432472+00:00 app[web.1]: memory, and will not scale past a single process.
2021-12-25T15:01:52.442695+00:00 app[web.1]: /app/node_modules/passport-oauth2/lib/strategy.js:87
2021-12-25T15:01:52.442712+00:00 app[web.1]: if (!options.clientID) { throw new TypeError('OAuth2Strategy requires a clientID option'); }
2021-12-25T15:01:52.442713+00:00 app[web.1]: ^
2021-12-25T15:01:52.442713+00:00 app[web.1]:
2021-12-25T15:01:52.442713+00:00 app[web.1]: TypeError: OAuth2Strategy requires a clientID option
2021-12-25T15:01:52.442714+00:00 app[web.1]: at Strategy.OAuth2Strategy (/app/node_modules/passport-oauth2/lib/strategy.js:87:34)
2021-12-25T15:01:52.442714+00:00 app[web.1]: at new Strategy (/app/node_modules/passport-google-oauth20/lib/strategy.js:52:18)
2021-12-25T15:01:52.442714+00:00 app[web.1]: at Object.<anonymous> (/app/app.js:97:14)
2021-12-25T15:01:52.442714+00:00 app[web.1]: at Module._compile (internal/modules/cjs/loader.js:1072:14)
2021-12-25T15:01:52.442718+00:00 app[web.1]: at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
2021-12-25T15:01:52.442718+00:00 app[web.1]: at Module.load (internal/modules/cjs/loader.js:937:32)
2021-12-25T15:01:52.442719+00:00 app[web.1]: at Function.Module._load (internal/modules/cjs/loader.js:778:12)
2021-12-25T15:01:52.442719+00:00 app[web.1]: at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
2021-12-25T15:01:52.442719+00:00 app[web.1]: at internal/main/run_main_module.js:17:47
2021-12-25T15:01:52.585001+00:00 heroku[web.1]: Process exited with status 1
2021-12-25T15:01:52.686499+00:00 heroku[web.1]: State changed from starting to crashed
2021-12-25T15:02:05.594774+00:00 app[api]: Set DB_ADMIN config vars by user soniyajaiswal995@gmail.com
2021-12-25T15:02:05.594774+00:00 app[api]: Release v5 created by user soniyajaiswal995@gmail.com
2021-12-25T15:02:06.819898+00:00 heroku[web.1]: State changed from crashed to starting
2021-12-25T15:02:09.868314+00:00 heroku[web.1]: Starting process with command `node app.js`
2021-12-25T15:02:11.032225+00:00 app[web.1]: Sat, 25 Dec 2021 15:02:11 GMT express-session deprecated req.secret; provide secret option at app.js:50:9        
2021-12-25T15:02:11.032895+00:00 app[web.1]: Warning: connect.session() MemoryStore is not
2021-12-25T15:02:11.032896+00:00 app[web.1]: designed for a production environment, as it will leak
2021-12-25T15:02:11.032896+00:00 app[web.1]: memory, and will not scale past a single process.
2021-12-25T15:02:11.042607+00:00 app[web.1]: /app/node_modules/passport-oauth2/lib/strategy.js:87
2021-12-25T15:02:11.042608+00:00 app[web.1]: if (!options.clientID) { throw new TypeError('OAuth2Strategy requires a clientID option'); }
2021-12-25T15:02:11.042609+00:00 app[web.1]: ^
2021-12-25T15:02:11.042609+00:00 app[web.1]:
2021-12-25T15:02:11.042610+00:00 app[web.1]: TypeError: OAuth2Strategy requires a clientID option
2021-12-25T15:02:11.042610+00:00 app[web.1]: at Strategy.OAuth2Strategy (/app/node_modules/passport-oauth2/lib/strategy.js:87:34)
2021-12-25T15:02:11.042610+00:00 app[web.1]: at new Strategy (/app/node_modules/passport-google-oauth20/lib/strategy.js:52:18)
2021-12-25T15:02:11.042611+00:00 app[web.1]: at Object.<anonymous> (/app/app.js:97:14)
2021-12-25T15:02:11.042611+00:00 app[web.1]: at Module._compile (internal/modules/cjs/loader.js:1072:14)
2021-12-25T15:02:11.042611+00:00 app[web.1]: at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
2021-12-25T15:02:11.042612+00:00 app[web.1]: at Module.load (internal/modules/cjs/loader.js:937:32)
2021-12-25T15:02:11.042612+00:00 app[web.1]: at Function.Module._load (internal/modules/cjs/loader.js:778:12)
2021-12-25T15:02:11.042612+00:00 app[web.1]: at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
2021-12-25T15:02:11.042613+00:00 app[web.1]: at internal/main/run_main_module.js:17:47
2021-12-25T15:02:11.173932+00:00 heroku[web.1]: Process exited with status 1
2021-12-25T15:02:11.236915+00:00 heroku[web.1]: State changed from starting to crashed
2021-12-25T15:02:18.714430+00:00 app[api]: Set DB_PASS config vars by user soniyajaiswal995@gmail.com
2021-12-25T15:02:18.714430+00:00 app[api]: Release v6 created by user soniyajaiswal995@gmail.com
2021-12-25T15:02:18.957618+00:00 heroku[web.1]: State changed from crashed to starting
2021-12-25T15:02:21.915023+00:00 heroku[web.1]: Starting process with command `node app.js`
2021-12-25T15:02:23.655207+00:00 app[web.1]: Sat, 25 Dec 2021 15:02:23 GMT express-session deprecated req.secret; provide secret option at app.js:50:9        
2021-12-25T15:02:23.656076+00:00 app[web.1]: Warning: connect.session() MemoryStore is not
2021-12-25T15:02:23.656077+00:00 app[web.1]: designed for a production environment, as it will leak
2021-12-25T15:02:23.656077+00:00 app[web.1]: memory, and will not scale past a single process.
2021-12-25T15:02:23.667352+00:00 app[web.1]: /app/node_modules/passport-oauth2/lib/strategy.js:87
2021-12-25T15:02:23.667354+00:00 app[web.1]: if (!options.clientID) { throw new TypeError('OAuth2Strategy requires a clientID option'); }
2021-12-25T15:02:23.667355+00:00 app[web.1]: ^
2021-12-25T15:02:23.667355+00:00 app[web.1]:
2021-12-25T15:02:23.667355+00:00 app[web.1]: TypeError: OAuth2Strategy requires a clientID option
2021-12-25T15:02:23.667356+00:00 app[web.1]: at Strategy.OAuth2Strategy (/app/node_modules/passport-oauth2/lib/strategy.js:87:34)
2021-12-25T15:02:23.667356+00:00 app[web.1]: at new Strategy (/app/node_modules/passport-google-oauth20/lib/strategy.js:52:18)
2021-12-25T15:02:23.667356+00:00 app[web.1]: at Object.<anonymous> (/app/app.js:97:14)
2021-12-25T15:02:23.667357+00:00 app[web.1]: at Module._compile (internal/modules/cjs/loader.js:1072:14)
2021-12-25T15:02:23.667357+00:00 app[web.1]: at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
2021-12-25T15:02:23.667358+00:00 app[web.1]: at Module.load (internal/modules/cjs/loader.js:937:32)
2021-12-25T15:02:23.667358+00:00 app[web.1]: at Function.Module._load (internal/modules/cjs/loader.js:778:12)
2021-12-25T15:02:23.667358+00:00 app[web.1]: at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
2021-12-25T15:02:23.667359+00:00 app[web.1]: at internal/main/run_main_module.js:17:47
2021-12-25T15:02:24.059553+00:00 heroku[web.1]: Process exited with status 1
2021-12-25T15:02:24.113339+00:00 heroku[web.1]: State changed from starting to crashed
2021-12-25T15:04:27.000000+00:00 app[api]: Build started by user soniyajaiswal995@gmail.com
2021-12-25T15:04:55.732410+00:00 app[api]: Release v7 created by user soniyajaiswal995@gmail.com
2021-12-25T15:04:55.732410+00:00 app[api]: Deploy 28c347cb by user soniyajaiswal995@gmail.com
2021-12-25T15:04:55.964469+00:00 heroku[web.1]: State changed from crashed to starting
2021-12-25T15:04:58.000000+00:00 app[api]: Build succeeded
2021-12-25T15:04:58.661868+00:00 heroku[web.1]: Starting process with command `node app.js`
2021-12-25T15:04:59.859458+00:00 app[web.1]: Sat, 25 Dec 2021 15:04:59 GMT express-session deprecated req.secret; provide secret option at app.js:27:9        
2021-12-25T15:04:59.860069+00:00 app[web.1]: Warning: connect.session() MemoryStore is not
2021-12-25T15:04:59.860070+00:00 app[web.1]: designed for a production environment, as it will leak
2021-12-25T15:04:59.860070+00:00 app[web.1]: memory, and will not scale past a single process.
2021-12-25T15:04:59.869458+00:00 app[web.1]: /app/node_modules/passport-oauth2/lib/strategy.js:87
2021-12-25T15:04:59.869466+00:00 app[web.1]: if (!options.clientID) { throw new TypeError('OAuth2Strategy requires a clientID option'); }
2021-12-25T15:04:59.869466+00:00 app[web.1]: ^
2021-12-25T15:04:59.869467+00:00 app[web.1]:
2021-12-25T15:04:59.869467+00:00 app[web.1]: TypeError: OAuth2Strategy requires a clientID option
2021-12-25T15:04:59.869467+00:00 app[web.1]: at Strategy.OAuth2Strategy (/app/node_modules/passport-oauth2/lib/strategy.js:87:34)
2021-12-25T15:04:59.869467+00:00 app[web.1]: at new Strategy (/app/node_modules/passport-google-oauth20/lib/strategy.js:52:18)
2021-12-25T15:04:59.869468+00:00 app[web.1]: at Object.<anonymous> (/app/app.js:66:14)
rror code=H10 desc="App crashed" method=GET path="/" host=agile-journey-27742.herokuapp.com request_id=aa9d093d-d785-4933-9c55-b9ce42ed5075 fwd="110.227.56.110" dyno= connect= service= status=503 bytes= protocol=https
2021-12-25T15:05:06.063156+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=agile-journey-27742.herokuapp.com request_id=231a0059-325c-4e81-b20d-20c70a8065d3 fwd="110.227.56.110" dyno= connect= service= status=503 bytes= protocol=https

1. Try to set up this type of directory Structure 1.尝试设置这种类型的目录结构

|__client/  THIS IS EVERYTHING FROM THE REACT SIDE 
    |__ node_modules/
        |__ tons of stuff...
    |__ public/
        |__ index.html
        |__ favicon.ico
        |__ etc.
    |__ src/
        |__ index.js
        |__ main/
            |__ App.js
            |__ etc.
|__ models/
    |__ user.js
    |__ todo.js
    |__ etc.
|__ node_modules/
    |__ stuff...
|__ routes
    |__ userRoutes.js
    |__ todoRoutes.js
    |__ etc.
|__ .gitignore
|__ package.json
|__ server.js
|__ etc.

2. Please Add this Middleware 2.请添加此中间件

// ... Other imports
const path = require("path");

// Other app.use middleware
app.use(express.static(path.join(__dirname, "client", "build")));

// Right before your app.listen(), add this:
app.get("*", (req, res) => {
  res.sendFile(path.join(__dirname, "client", "build", "index.html"));
});

app.listen(...);

3. Add a proxy to the client's package.json based on your deploy server 3.根据你的部署服务器添加代理到客户端的package.json

"proxy": "http://localhost:8000"

So, your package.json file looks like...因此,您的package.json文件看起来像...

{
    "name": "client",
    "version": "0.1.0",
    "private": true,
    "dependencies": {
        "axios": "^0.17.1",
        "react": "^16.2.0",
        "react-dom": "^16.2.0",
        "react-scripts": "1.0.17"
    },
    "scripts": {
        "start": "react-scripts start",
        "build": "react-scripts build",
        "test": "react-scripts test --env=jsdom",
        "eject": "react-scripts eject"
    },
    "proxy": "http://localhost:8000"
}

4. Setting environment variables on the website: 4、在网站上设置环境变量:

A. Open your app in Heroku
B. Go to "Settings"
C. Click "Reveal Config Vars"
D. Add a new variable and click "Add". Done!
E. Your port has to look like:- process.env.PORT || 8000

Your Port looks like this:-您的端口如下所示:-

const port = process.env.PORT || 8000;
.
.
.
app.listen(port);

5. Set up MongoDB Atlas IP access control 5.设置MongoDB Atlas IP访问控制

Next, you'll need to whitelist your IP address so that you can access your cluster.接下来,您需要将您的 IP 地址列入白名单,以便您可以访问您的集群。 Go to Network Access on the navigation menu, and Add IP Address. Go 到导航菜单上的网络访问,并添加 IP 地址。 You can either Add Your Current IP Address or Allow Access from Anywhere .您可以添加您当前的 IP 地址或允许从任何地方访问 Confirm your choice.确认您的选择。

For any projects deployed through Heroku, you'll have to select Allow Access from Anywhere.对于通过 Heroku 部署的任何项目,您必须 select 允许从任何地方访问。 This is because Heroku uses Dynamic IPs.这是因为 Heroku 使用动态 IP。 While this isn't the most secure option, it is fine for now.虽然这不是最安全的选择,但目前还可以。

6. Add this scripts start heroku-postbuild and engines 6.添加这个脚本start heroku-postbuildengines

After all this, your server's package.json should look something like this: In the terminal, type node -v .毕竟,您的服务器的package.json应该如下所示: 在终端中,键入node -v It should spit out the version of Node.js you're using.它应该吐出您正在使用的 Node.js 的版本。 add this version in the "engines": "14.17.5""engines": "14.17.5"

{
    "name": "mern-to-heroku",
    "version": "1.0.0",
    "main": "server.js",
    "license": "MIT",
    "dependencies": {
        "body-parser": "^1.18.2",
        "express": "^4.16.2",
        "mongoose": "^4.13.6",
        "morgan": "^1.9.0"
    },
    "scripts": {
        "start": "node server.js",
        "heroku-postbuild": "cd client && npm install --only=dev && npm install && npm run build"
    },
    "engines": {
        "node": "14.17.5"
    }
}

You should now be all set up to deploy your site through Heroku!您现在应该已经准备好通过 Heroku 部署您的网站了!

The issue is your app can't find the Google Client ID.问题是您的应用找不到 Google 客户端 ID。

It seems like you haven't configured your.env variables properly in Heroku.您似乎没有在 Heroku 中正确配置 your.env 变量。 The solution is really simple.解决方案非常简单。

DOTENV Approach If you've defined your .env in this manner, DOTENV 方法 如果您以这种方式定义了.env

MONGO_URL="xxx.....xxx"
GOOGLE_CLIENT_ID="xx......xxx"
GOOGLE_CLIENT_SECRET="xxx.....xxx"

and in your passport-setup and db-setup you are using dotenv as,在您的护照设置和数据库设置中,您使用 dotenv 作为,

require('dotenv').config();
.
.
.
passport.use(
  new GoogleStrategy
  (
    {
      clientID : process.env.GOOGLE_CLIENT_ID,
      clientSecret : process.env.GOOGLE_CLIENT_SECRET,
      callbackURL : '/auth/google/callback'
    },
.
.
.

then, you must have declared a .env file in your project's root directory on your computer.那么,您必须在计算机上项目的根目录中声明一个.env文件。

Your.gitignore file might have .env mentioned, as this is the standard way of doing it (You don't push env variables to public/team repositories).您的 .gitignore 文件可能提到了.env ,因为这是执行此操作的标准方式(您不会将 env 变量推送到公共/团队存储库)。

The reason it works on your computer is that the app has the context of the environment variables.它在您的计算机上运行的原因是该应用程序具有环境变量的上下文。 In Heroku since the .env file isn't present, the app doesn't know where to find them.在 Heroku 中,由于.env文件不存在,应用程序不知道在哪里可以找到它们。

All you have to do is add your environment variables to Heroku.您所要做的就是将您的环境变量添加到 Heroku。 Just go to settings in Heroku Dashboard, go to the Config variables menu.只需 go 到 Heroku 仪表板中的设置,go 到配置变量菜单。

Add your env variables in the format以格式添加您的环境变量

Restart the dyno.重新启动测功机。

This would solve your issue.这将解决您的问题。

1. Add this middleware in the app.js 1.在app.js中添加这个中间件

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

2. Folder Structure 2.文件夹结构

|__public/   
    |__ css/
        |__ css files...
    |__ js/
        |__ js files...

3. Import this way 3.这样导入

Now you set the path to the public directory you have to give the path public folder when you import现在您设置公共目录的路径,您必须在导入时提供路径公共文件夹

<link rel="stylesheet" href="/css/main.css" />

<script src="/js/main.js" crossorigin="anonymous"> </script>

You should now be all set up to access CSS files您现在应该已准备好访问 CSS 文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在 Heroku 上成功部署,但使用 Express + Node.JS 时出现应用程序错误 - Success deploy on Heroku but I get Application Error using Express + Node.JS Node.js 应用程序在本地运行,但在部署到 heroku 时出现应用程序错误 - Node.js app works locally but when deploy to heroku I get application error 我是否应该在express.js应用程序中延迟app.listen()直到资产完成加载(express / heroku)? - Should I delay app.listen() in express.js app until assets are finished loading (express/heroku)? 为什么我收到错误 app.get is not a function in express.js - Why am i getting an error app.get is not a function in express.js 为什么我的异步 express.js 中间件出现 502 Bad Gateway 错误? - Why do i get 502 Bad Gateway error in my async express.js middleware? 在不含express.js的heroku中的node.js应用程序中部署路由 - Deploy route in node.js application in heroku without express.js 我正在尝试将node js应用程序部署到heroku,但是在推送到master时仍然出现错误 - I am trying to deploy my node js app to heroku but I keep getting an error when pushing to master 我正在尝试将我的 node.js 应用程序部署到 heroku - I am trying to deploy my node.js application into heroku 当我在heroku上部署我的nodejs应用程序时,构建成功但出现了“应用程序错误” - When I deploy my nodejs app on heroku, build success but got a “Application Error” Heroku上的Express JS应用显示应用程序错误 - Express JS app on Heroku shows Application Error
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM