#reactjs #express #heroku
#reactjs #выразить #heroku
Вопрос:
Я пытаюсь понять, как развернуть приложения react-express в Heroku, поэтому я создал очень простое приложение для этого. Это create-react-app
интерфейс с экспресс-серверной частью, с сервером разработки на localhost: 3000, который вызывает прокси-api на сервер на localhost: 5000. Однако я продолжаю получать «ошибку приложения» всякий раз, когда пытаюсь загрузить URL-адрес своего приложения, и после проверки журналов ошибок я заметил следующую ошибку:
Error: Cannot find module '/app/index.js'
app[web.1]: at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15)
app[web.1]: at Function.Module._load (internal/modules/cjs/loader.js:667:27)
app[web.1]: at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
app[web.1]: at internal/main/run_main_module.js:17:47 {
app[web.1]: code: 'MODULE_NOT_FOUND',
Любые советы о том, как это решить?
Вот структура моего проекта:
client
-build
-node_modules
public
-index.html
src
-App.js
-index.js
package.json
yarn.lock
server
-models
-reviews.js
-node_modules
-package.json
-server.js
-yarn.lock
И вот как я настроил свой сервер:
const express = require('express');
const cors = require('cors')
const bodyParser = require('body-parser');
const mongoose = require('mongoose')
const Review = require('./models/reviews')
const path = require('path')
//Server
const app = express();
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Listening on port ${port}`));
//Middleware
app.use(express.static(path.join(__dirname, 'build')));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.urlencoded())
app.use(cors())
//Mongo config
const dbURI = 'mongodb srv://joshydsimon:Josh1985!@mochawelly.8cxdz.mongodb.net/MochaWelly?retryWrites=trueamp;w=majority'
mongoose.connect(dbURI, {useNewUrlParser:true, useUnifiedTopology:true})
.then(() => {
console.log('connected to db')
})
.catch((err) => {
console.log(err)
})
app.get('/api/all-reviews', (req,res) => {
Review.find()
.then((result) => {
res.send(result)
})
.catch(err => {
console.log(err)
})
})
app.get('/*', (req, res) => {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});
Наконец, вот несколько сценариев, которые я добавил в package.json (на стороне сервера):
"start": "node index.js",
"heroku-postbuild": "cd client amp;amp; npm install amp;amp; npm run build",
Комментарии:
1. привет, мне интересно, найдете ли вы решение, поскольку большинство онлайн-руководств предназначены для каталогов, в которых сервер и сценарий постбилдинга heroku находятся в главном корне.
Ответ №1:
Возможно, он не направляется в вашу клиентскую папку?
//Try this?
if (process.env.NODE_ENV === "production") {
app.use(express.static("client/build"));
app.get("*", (req, res) => {
res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
});
}
Также попробуйте это:
"scripts": {
"client-install": "npm install --prefix client",
"start": "node server.js",
"server": "nodemon server.js",
"client": "npm start --prefix client",
"dev": "concurrently "npm run server" "npm run client"",
"heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix client amp;amp; npm run build --prefix client"}
Также попробуйте это:
app.use(express.static(path.join(__dirname, 'client/build')));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.urlencoded())
app.use(cors())