在Heroku上部署MERN应用程序之前,我已经在Heroku上部署了我的全栈web应用程序。我做了同样的事情,但我仍然在logs
中得到error
。
错误:
2022-07-07T13:23:00.193856+00:00 app[web.1]: Error: Cannot find module 'html'
2022-07-07T13:23:00.193883+00:00 app[web.1]: Require stack:
2022-07-07T13:23:00.193884+00:00 app[web.1]: - /app/node_modules/express/lib/view.js
2022-07-07T13:23:00.193885+00:00 app[web.1]: - /app/node_modules/express/lib/application.js
2022-07-07T13:23:00.193885+00:00 app[web.1]: - /app/node_modules/express/lib/express.js
2022-07-07T13:23:00.193885+00:00 app[web.1]: - /app/node_modules/express/index.js
2022-07-07T13:23:00.193886+00:00 app[web.1]: - /app/app.js
2022-07-07T13:23:00.193886+00:00 app[web.1]: - /app/server.js
2022-07-07T13:23:00.193887+00:00 app[web.1]: at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
2022-07-07T13:23:00.193889+00:00 app[web.1]: at Function.Module._load (node:internal/modules/cjs/loader:778:27)
2022-07-07T13:23:00.193889+00:00 app[web.1]: at Module.require (node:internal/modules/cjs/loader:1005:19)
2022-07-07T13:23:00.193890+00:00 app[web.1]: at require (node:internal/modules/cjs/helpers:102:18)
2022-07-07T13:23:00.193890+00:00 app[web.1]: at new View (/app/node_modules/express/lib/view.js:81:14)
2022-07-07T13:23:00.193891+00:00 app[web.1]: at Function.render (/app/node_modules/express/lib/application.js:587:12)
2022-07-07T13:23:00.193891+00:00 app[web.1]: at ServerResponse.render (/app/node_modules/express/lib/response.js:1039:7)
2022-07-07T13:23:00.193891+00:00 app[web.1]: at /app/controllers/homeController.js:15:6
2022-07-07T13:23:00.193891+00:00 app[web.1]: at /app/middlewares/bigPromise.js:4:19
2022-07-07T13:23:00.193892+00:00 app[web.1]: at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
2022-07-07T13:23:00.194187+00:00 heroku[router]: at=info method=GET path="/" host=project-review-webapp.herokuapp.com request_id=26bf0adc-0ece-413c-81e3-62b84376c188 fwd="103.67.17.76" dyno=web.1 connect=0ms service=2ms status=500 bytes=510 protocol=https
我关注的博客:
将MERN应用部署到Heroku
如何将MERN应用程序部署到Heroku
Procfile:web: node server.js
app目录结构:
- client
- config
- controllers
- middlewares
- models
- node_modules
- routes
- utils
- .env
- .gitignore
- app.js
- nodemon.json
- package.json
- package-lock.json
- Procfile
- server.js
Package.json
{
"name": "projectreview",
"version": "1.0.0",
"description": "",
"main": "server.js",
"engines": {
"node": "16.15.0"
},
"scripts": {
"start": "node server.js",
"dev": " nodemon server.js",
"heroku-postbuild": "cd client && npm install --only=dev && npm install && npm run build"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"bcryptjs": "^2.4.3",
"cloudinary": "^1.30.0",
"cookie-parser": "^1.4.6",
"cors": "^2.8.5",
"dotenv": "^16.0.1",
"express": "^4.18.1",
"express-fileupload": "^1.4.0",
"jsonwebtoken": "^8.5.1",
"mongoose": "^6.4.2",
"nodemailer": "^6.7.6",
"path": "^0.12.7",
"validator": "^13.7.0"
},
"devDependencies": {
"nodemon": "^2.0.18"
}
}
我不知道为什么我得到这个错误?怎么解呢?我哪里做错了?
问题在于controllers/homeController.js
中的代码:
exports.home = BigPromise((req, res) => {
res
.status(200)
.render(
"../client/public/index.html"
);
});
为什么会出现这个错误
这里,您要求Express"渲染";您的index.html
文件,这意味着您希望Express使用模板引擎来处理和转换文件。因为你指定文件扩展名(html
),表达会加载一个叫做html
NPM模块为模板引擎处理文件。你看到的错误是来自Express试图加载html
NPM模块,但它没有安装。然而,这些都不是你真正想要的。
如何修复
您实际想要Express做的只是将未经修改的HTML文件发送到客户端,而不是使用模板引擎处理该文件。为此,使用sendFile
代替render
,如下所示:
const path = require("path");
exports.home = BigPromise((req, res) => {
res
.status(200)
.sendFile(
path.join(__dirname, "../client/public/index.html")
);
});
请注意,您的GitHub repo中的client
目录目前是空的,因此您还需要添加文件client/public/index.html
才能使其工作。
所有这些都可以在本地调试和测试,而不需要Heroku参与。您可以在本地系统上运行npm run dev
,并将web浏览器指向http://localhost:4000
来查看结果。