MERN

#javascript #reactjs #heroku #deployment #mern

#javascript #reactjs #heroku #развертывание #mern

Вопрос:

Обновление на консоли в браузере Windows (где приложение не загружается, только фоновое изображение) У меня ошибка:

 Uncaught TypeError: Cannot read property 'apply' of undefined
  

Эта ошибка не отображается в браузере внутри Ubuntu, в котором она на самом деле работает. Я расследую это


Я использую Oracle VM VirtualBox с ОС Debian Ubuntu для разработки этого приложения MERN. Я перенес его на Heroku. В журналах нет сообщений об ошибках, и веб-сайт отлично открывается внутри virtualbox.

Но в моем браузере Windows он отображает только фоновое изображение (слегка искаженное) и делает то же самое, когда я пытаюсь получить к нему доступ с мобильного устройства.

У меня было много ошибок, приведших к этому моменту, первоначально мое приложение технически «работало», но с Cannot get / ошибкой на экране, которая, как я выяснил, на самом деле работала, но просто отображала серверную часть моего приложения (я проверил, перейдя по URL-адресам, которые я настроил в Express, и мои данныебыло ли)

Итак, я установил cors и path (следуя другому сообщению stackoverflow) и настроил server.js , и теперь это вроде как работает. Но я не уверен, в чем проблема.

Структура приложения такова, что в корневом каталоге у меня есть все, что мне нужно (server.js файл, маршруты, модели, модули и т.д.), Включая каталог / клиент, в котором находится интерфейсное приложение React.

Мое server.js файл

 const mongoose = require('mongoose');
const express = require('express');
const app = express();
const config = require('config');
const cors = require('cors');
const path = require('path');

// Middleware
app.use(express.json());

// DB Config
// You can get all your config/ values with config.get('')
const db = config.get('mongoURI');

// Connect to MongoDB
mongoose
    .connect(process.env.URI || db, { 
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useCreateIndex: true
    })
    .then(() => console.log("Connected to MongoDB.."))
    .catch(err => console.log(err));

// Available Routes
const tournaments = require('./routes/api/tournaments');
const users = require('./routes/api/users');
// Use Routes
app.use(cors());
app.use('/tournaments', tournaments);
app.use('/users', users);

// For Heroku deployment
if(process.env.NODE_ENV === 'production') {
    app.use(express.static(path.join(__dirname, 'client', 'build')));
    app.get('*', (req, res) => {
        res.sendFile(path.join(__dirname, 'client', 'build', 'index.html'))
    });
};

// Run Server
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Server started on port: ${port}`));
  

Мой package.json

 {
  "name": "smash-hosting",
  "version": "1.0.0",
  "description": "",
  "engines": {
    "node": "12.16.2"
  },
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" amp;amp; exit 1",
    "client-install": "cd client amp;amp; npm install",
    "start": "node server.js",
    "server": "nodemon server.js",
    "client": "cd client amp;amp; npm start",
    "dev": "concurrently "npm run server" "npm run client"",
    "heroku-postbuild": "cd client amp;amp; npm install amp;amp; npm run build"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "bcryptjs": "^2.4.3",
    "concurrently": "^5.0.0",
    "config": "^3.2.4",
    "cors": "^2.8.5",
    "express": "^4.17.1",
    "jsonwebtoken": "^8.5.1",
    "moment": "^2.26.0",
    "mongoose": "^5.7.12",
    "nodemon": "^1.19.4",
    "path": "^0.12.7",
    "react-icons": "^3.10.0",
    "react-tournament-bracket": "^0.2.4"
  },
  "devDependencies": {
    "nodemon": "^1.19.4"
  }
}
  

Ответ №1:

Кажется, что сервер запущен, но не может подключить клиента. Команда Bash amp;amp; (и) не работала в Windows. Заменить одним amp; оператором.

Комментарии:

1. Спасибо за совет. Похоже, это все же сломало его (ошибка 404). Я пробую это --prefix client в сценариях, если amp;amp; действительно является проблемой

Ответ №2:

Решена проблема!

По-видимому, проблема была в Redux. Я заметил в браузере, где мое приложение не отображалось должным образом, в консоли была ошибка: Uncaught TypeError: Cannot read property 'apply' of undefined

Это привело меня к https://github.com/reduxjs/redux/issues/2359 который имеет ряд различных решений.

В конечном счете, удаление кода REDUX_EXTENSION_TOOLS из хранилища redux позволило моему приложению heroku правильно отображаться в разных браузерах, включая мой телефон.

store.js файл:

 import { createStore, applyMiddleware, compose } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers';
const initialState = {};
const middleware = [thunk];
const store = createStore(
    rootReducer,
    initialState,
    compose(
        applyMiddleware(...middleware)
        // window.__REDUX_DEVTOOLS_EXTENSION__ amp;amp; window.__REDUX_DEVTOOLS_EXTENSION__()
    )
);
export default store;