#reactjs #react-router #apollo-client #react-apollo #apollo-server
Вопрос:
Я учусь реагировать. У меня есть приложение React, которое использует api Google, чтобы разрешить зарегистрированным пользователям искать и сохранять книги в базе данных Mongo. В разработке все работает правильно, но когда я запускаю сборку для производства, я получаю ошибку 404, указывающую, что путь запроса не найден.
Моя серверная часть server.js:
const express = require('express');
const { ApolloServer } = require('apollo-server-express');
const path = require('path');
const db = require('./config/connection');
const { typeDefs, resolvers } = require('./schemas');
const { authMiddleware } = require('./utils/auth');
const app = express();
const PORT = process.env.PORT || 3001;
const server = new ApolloServer({
typeDefs,
resolvers,
context: authMiddleware
});
server.applyMiddleware({ app });
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
// if we're in production, serve client/build as static assets
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'));
});
db.once('open', () => {
app.listen(PORT, () => {
console.log(`API server running on port ${PORT}!`);
console.log(`Use GraphQL at http://localhost:${PORT}${server.graphqlPath}`);
});
});
Моя клиентская сторона App.js:
import React from 'react';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
import SearchBooks from './pages/SearchBooks';
import SavedBooks from './pages/SavedBooks';
import Navbar from './components/Navbar';
import {
ApolloClient,
InMemoryCache,
ApolloProvider,
HttpLink,
ApolloLink,
from
} from "@apollo/client";
import { onError } from '@apollo/client/link/error';
const httpLink = new HttpLink({
uri: '/graphql'
});
const errorLink = onError(({ graphQLErrors, networkError }) => {
if (graphQLErrors)
graphQLErrors.forEach(({ message, locations, path }) =>
console.log(
`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
),
);
if (networkError) console.log(`[Network error]: ${networkError}`);
});
const tokenLink = new ApolloLink((operation, forward) => {
const token = localStorage.getItem('id_token');
operation.setContext({
headers: {
authorization: token ? `Bearer ${token}` : 'No token found in App.js'
}
});
return forward(operation);
});
const client = new ApolloClient({
// The `from` function combines an array of individual links
// into a link chain
link: from([errorLink, tokenLink, httpLink]),
cache: new InMemoryCache()
});
function App() {
return (
<ApolloProvider client={client}>
<Router>
<>
<Navbar />
<Switch>
<Route exact path='/' component={SearchBooks} />
<Route exact path='/saved' component={SavedBooks} />
<Route render={() => <h1 className='display-2'>Wrong page!</h1>} />
</Switch>
</>
</Router>
</ApolloProvider>
);
}
export default App;
Это мой первый раз, когда я задаю вопрос, поэтому, если вам нужна/полезна другая информация, пожалуйста, дайте мне знать, и я отредактирую вопрос. Спасибо.
Ответ №1:
Мне помогли, и кто-то указал, что я не включил папку .env, когда думал, что уже включил! Иногда это простые вещи.