React-Router 5 и Express - универсальный запасной вариант маршрута - PullRequest
0 голосов
/ 18 января 2020

Я работаю над проектом на основе стека MERN с Redux, Reaction-router и Webpack 4, и я не могу понять, что я делаю неправильно. Моя сборка разработки работает нормально, но когда я запускаю производственную сборку, мой альтернативный маршрут не работает. Файл index. html работает только потому, что я использую express.static, когда я удаляю его, он вообще не работает. Реактивный маршрутизатор работает нормально, когда я перехожу к localhost: 3000, но если я пытаюсь вручную перейти к localhost: 3000 / about, возникает внутренняя ошибка сервера. Поэтому я предполагаю, что запрос app.get по какой-то причине просто не работает. Вот мой код сервера:

import express from 'express';
import path from 'path';

import bodyParser from 'body-parser';
import cors from 'cors';
import mongoose from 'mongoose';

const PORT = process.env.PORT;
const MONGODB_URI = process.env.MONGODB_URI;
const history = require('connect-history-api-fallback');

const app = express();

app.use(cors())

//DB setup
mongoose.Promise = global.Promise;
mongoose.connect(MONGODB_URI);
var db = mongoose.connection;

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
    console.log('We have been connected!');
});


if (process.env.NODE_ENV !== "production") {
    app.use(history());
    const webpack = require('webpack');
    const webpackDevMiddleware = require('webpack-dev-middleware');
    //require webpack config
    const config = require('../../webpack.dev.config.js');
    //create compiler
    const compiler = webpack(config);
    //use webpack-dev-middleware to serve the bundles
    app.use(webpackDevMiddleware(compiler, {
        publicPath: config.output.publicPath
    }));
    //enable HMR
    app.use(require('webpack-hot-middleware')(compiler));
} else {
    app.use(express.static("dist"));

    app.get("*", (req, res) => {
      res.sendFile(path.join("./dist", "index.html"));
    });
}



//Listen
app.listen(PORT, function() {
    console.log('Server is listening...');
});

Буду признателен за любую помощь в выяснении этого.

1 Ответ

0 голосов
/ 18 января 2020

Я предполагаю, что вы получаете сообщение об ошибке: TypeError: путь должен быть абсолютным или указать root для res.sendFile

Чтобы исправить это, вы должны использовать path.resolve вместо path.join и скорректируйте путь соответственно:

app.get("*", (req, res) => {
  res.sendFile(path.resolve("./dist", "index.html"));
});
...