【问题标题】:Problem with React Router when deploy build on Node.js server在 Node.js 服务器上部署构建时 React Router 出现问题
【发布时间】:2020-07-29 14:39:28
【问题描述】:

我已经为我的 ReactJS 应用程序做了一些路由,它在 localhost 中完美运行。但是当我想在我的 Node.js 服务器上部署它时,我只能访问我的根路径“/”。对于另一个我得到这个:

Cannot GET /dir/secret/dashboard

我很确定我做错了什么,但我不知道是什么。

这是我使用 react-route-dom 的代码:

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router , Route } from 'react-router-dom';

import './index.css';

import App from './App';

import Register from './pages/Register';
import Login from './pages/Login';
import Dashboard from './pages/Dashboard';
import Settings from './pages/Settings';

import * as serviceWorker from './serviceWorker';

ReactDOM.render(
    <Router>
        <div>
            <Route exact path='/' component={App} />
            <Route path='/dir/secret/login' component={Login} />
            <Route path="/dir/secret/register" component={Register} />  
            <Route exact path="/dir/secret/dashboard" component={Dashboard} />
            <Route exact path="/dir/secret/dashboard/settings" component={Settings} />      
        </div>
    </Router>, 
    document.getElementById('root')
);

serviceWorker.unregister();

server.js

const express = require('express');
const server = express();
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const path = require('path');
const cron = require('node-cron');
const axios = require('axios');

const port = 4200;
const cors = require('cors');

mongoose.Promise = require('bluebird');
mongoose.connect('mongodb+srv://***:***@***-hsm29.mongodb.net/test?retryWrites=true&w=majority', {useNewUrlParser: true, useUnifiedTopology: true})
    .then(() => {
        console.log('> Connected to your MongoDB Cluster');
    })
    .catch(err => {
        console.error('App starting error:', err.stack);
        process.exit(1);
    });

const router = require('./routes/router');

const corsOption = {
    origin: '*',
    optionSuccessStatus: 200,
}

server.use(express.static('public'));
server.use(cors(corsOption));
server.use(bodyParser.urlencoded({extended: true}));
server.use(bodyParser.json());

const upload = require('./upload')
server.post('/upload', upload)

const banner = require('./banner')
server.post('/banner', banner)

server.use(express.static(__dirname+'/public'));

server.use('/api', router);

server.use(express.static(path.join(__dirname, 'build')));
-server.get('/', function (req, res) {
+server.get('/*', function (req, res) {
   res.sendFile(path.join(__dirname, 'build', 'index.html'));
 });
});

server.listen(port, function(){
    console.log(`> Ready on http://localhost:${port}`);
});

提前感谢您的时间和帮助

【问题讨论】:

  • 您的 Express 设置有点混乱 - 您希望 React 代码位于 ./build 还是 ./public 中?你似乎也发布了一个 diff
  • 我已将我的 React 构建放入服务器的构建文件夹中。公共目录用于存放媒体文件。你所说的“差异”是什么意思?我是 stackoverflow 的新手,抱歉

标签: javascript node.js reactjs express react-router-dom


【解决方案1】:

好的,我已经解决了我的问题。这是我所做的修改

索引.js

import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter} from 'react-router-dom';

import './index.css';

import App from './App';

import * as serviceWorker from './serviceWorker';

ReactDOM.render(
    <BrowserRouter>
        <App/>
    </BrowserRouter>, 
    document.getElementById('root')
);

serviceWorker.unregister();

App.js

import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

import Content from './pages/Content';
import Register from './pages/Register';
import Login from './pages/Login';
import Dashboard from './pages/Dashboard';
import Settings from './pages/Settings';

import './App.css';

function App() {
  return (
    <>
      <Router basename={process.env.PUBLIC_URL+'/'}>
        <div className="App">
          <Switch>
            <Route exact path='/' component={Content}/>
            <Route path='/dir/secret/login' component={Login} />
            <Route path="/dir/secret/register" component={Register} />  
            <Route exact path="/dir/secret/dashboard" component={Dashboard} />
            <Route exact path="/dir/secret/dashboard/settings" component={Settings} />      
          </Switch>
        </div>
      </Router>
    </>
  );
}

export default App;

服务器.js

const express = require('express');
const server = express();
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const path = require('path');
const cron = require('node-cron');
const axios = require('axios');

const port = 4200;
const cors = require('cors');

mongoose.Promise = require('bluebird');
mongoose.connect('mongodb+srv://***:***@***-hsm29.mongodb.net/test?retryWrites=true&w=majority', {useNewUrlParser: true, useUnifiedTopology: true})
    .then(() => {
        console.log('> Connected to your MongoDB Cluster');
    })
    .catch(err => {
        console.error('App starting error:', err.stack);
        process.exit(1);
    });

const router = require('./routes/router');

const corsOption = {
    origin: '*',
    optionSuccessStatus: 200,
}

server.use(express.static('public'));
server.use(cors(corsOption));
server.use(bodyParser.urlencoded({extended: true}));
server.use(bodyParser.json());

const upload = require('./upload')
server.post('/upload', upload)

const banner = require('./banner')
server.post('/banner', banner)

server.use(express.static(__dirname+'/public'));

server.use('/api', router);

server.use(express.static(path.join(__dirname, 'build')));
server.get('/*', function(req, res) {
    res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

server.listen(port, function(){
    console.log(`> Ready on http://localhost:${port}`);
});

所以我修改了所有路由以匹配 react-router-dom 文档,我只是更改了这个:

server.use(express.static(path.join(__dirname, 'build')));
-server.get('/', function (req, res) {
+server.get('/*', function (req, res) {
   res.sendFile(path.join(__dirname, 'build', 'index.html'));
 });

到这里:

server.use(express.static(path.join(__dirname, 'build')));
server.get('/*', function(req, res) {
    res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

我很确定有更好的方法来做我想做的事,但事实是这种方法对我有用,所以如果它可以帮助任何人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2016-05-25
    • 1970-01-01
    • 2017-09-10
    • 2015-05-09
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多