У меня проблема с маршрутами в ReactJS. Я определил некоторые маршруты следующим образом:
...Import / Class...
class App extends Component {
render() {
return (
<div>
<Header />
<Switch>
<Route exact path = "/" component = {Home} />
<Route path = "/login" component = {Login} />
<Route path = "/signup" component = {Signup} />
<ProtectedRoute path = "/user/contact" component = {Contact} />
<ProtectedRoute path = "/user/person" component = {UserPerson} />
<ProtectedRoute path = "/user/profile" component = {Profile} />
<Route component = {NotFound} />
</Switch>
<Footer />
</div>
);
}
}
...Export...
Ниже вы можете увидеть мой ProtectedRouteкласс
...Import / Class...
const ProtectedRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render = {props => (
AuthGestion.userIsAuthenticated() ? (
<Component {...props} />
) : (
<Redirect to = {{
pathname: '/login',
state: { from: props.location }
}}/>
)
)} />
);
...Export...
Когда я захожу на свою страницу с <NavLink to = "/user/person"></NavLink>, проблем нет, мой компонент загружается и я вижу свою страницу.
Но когда я перехожу по ссылке напрямую /user/person и перезагружаю свою страницу (CTRL + F5), я получаю Console ошибку SyntaxError: expected expression, got '<' и белую страницу.
Просто пользовательские маршруты не работают.
Я добавляю ниже информацию о моем сервере:
import path from 'path';
import bodyParser from 'body-parser';
import express from 'express';
import mongoose from 'mongoose';
import routes from './routes/index.route';
import config from '../../config/config';
import webpack from 'webpack';
import webpackConfig from '../../config/webpack.config.dev';
import webpackDevMiddleware from 'webpack-dev-middleware';
import webpackHotMiddleware from 'webpack-hot-middleware';
//Connexion MongoDB
mongoose.connect(config.mongodbUri, { useNewUrlParser: true });
mongoose.connection.on('connected', () => { console.info('MongoDB connecté'); });
mongoose.connection.on('error', (error) => { console.info(error); });
//Lancement serveur express
const server = express();
//Express need
server.use(bodyParser.json());
server.use(express.static(config.publicPath));
server.use(express.static(config.distPath));
//Hot reload
if (config.isDevMode) {
const webpackCompiler = webpack(webpackConfig);
server.use(webpackDevMiddleware(webpackCompiler, {}));
server.use(webpackHotMiddleware(webpackCompiler));
}
// Route vers l'API
server.use('/api', routes);
// Landing page
server.get('/*', (req, res) => {
res.sendFile(path.join(config.publicPath, '/index.html'));
});
//Ecoute du serveur
server.listen(config.port, () => {
console.info(`App here : http://${config.host}:${config.port}`);
});
export default server;
Не могли бы вы помочь мне понять проблему? И, возможно, исправить мою маршрутизацию, если это не хорошо.
Я добавил информацию о своем сервере. Это то, что вы хотите?
Вы получаете эту ошибку в запросе API или на самой странице html?
У меня нет никаких ошибок с моим API, я получил эту ошибку на лицевой стороне в консоли, на самой странице html. На данный момент я не вызывал свой API в 3 компонентах user/contact, user/person, user/profile
может быть то же самое, что и stackoverflow.com/a/37949474/11129751
Вопрос в том, возникает ли ошибка из-за вызова API или при загрузке страницы?
@ Фракция, ты прав, в моем index.html у меня было <script src = "./dist/client.bundle.js"></script>. Я убираю точку впереди/dist и теперь у меня больше нет ошибок... Я не знаю, как это работало до сегодняшнего дня...





для дальнейшего использования: https://stackoverflow.com/a/37949474/11129751
I've got a react/react-router page without any express and got the same error: SyntaxError: expected expression, got '<' which started to appear as soon as I configured a react route other then just root /.
After some experimenting I've figured out that in my index.html there was a link to js file:
So, the solution was to add / in the source path:
and the error has gone.
Hope that could help a bit.
Это изменилось со времен React-Router 6.
Вы МОЖЕТЕ использовать вложенные маршруты/компоненты с приведенным ниже синтаксисом.
import { Routes, Route, Navigate } from "react-router-dom";
function App() {
return (
<Routes>
<Route path = "/public" element = {<PublicPage />} />
<Route
path = "/protected"
element = {
// Good! Do your composition here instead of wrapping <Route>.
// This is really just inverting the wrapping, but it's a lot
// more clear which components expect which props.
<RequireAuth redirectTo = "/login">
<ProtectedPage />
</RequireAuth>
}
/>
</Routes>
);
}
function RequireAuth({ children, redirectTo }) {
let isAuthenticated = getAuth();
return isAuthenticated ? children : <Navigate to = {redirectTo} />;
}
Похоже, ваш сервер возвращает неправильную полезную нагрузку на внутреннем маршруте. Если ваше приложение управляет маршрутами на стороне клиента, это означает, что все маршруты, запрашиваемые с сервера, должны обслуживать клиентский код. Можете ли вы поделиться о вашем сервере?