Я пытался запустить приложение стека MERN на Heroku, в котором я использую как Express, так и GraphQL. Express для аутентификации и обновлений. GraphQL для получения данных для параметров входа (в какую школу вы хотите войти) и сохранения данных в React.Context при входе в систему, которые связаны с пользователем.
Я закончил предложенную часть проекта и развернул приложение на Heroku для тестирования и сбора отзывов.
Проблема в том, что когда я открываю приложение, фронт исчезает через несколько секунд, когда сервер отвечает, что соединение GraphQL отклонено. Тем не менее, приложение, работающее на моем компьютере, отлично работает с nodemon
с использованием concurrently
.
Я совершенно безнадежен, так как:
Procfile содержит правильный путь к серверному приложению и переднему прокси-серверу, включенному для подключения к 8080, поскольку приложение работает на 3000.
Вот пример кода для фронта:
// index.js
const client = new ApolloClient({
uri: 'http://localhost:8080/graphql'
})
ReactDOM.render(
<React.StrictMode>
<ApolloProvider client = {client} >
<Router>
<App />
</Router>
</ApolloProvider>
</React.StrictMode>,
document.getElementById('app')
);
И сзади:
// connect to DB
mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost/unimeetingsapp', {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
useCreateIndex: true
});
mongoose.connection.on('open', ()=>{
console.info('Connected to Database')
});
// heroku
if (process.env.NODE_ENV === "production") {
app.use(express.static("../client/build"));
}
app.use(bodyParser.json());
app.use(cors());
//app.use(express.urlencoded({ extended: false }));
//////////////////////
// Routes
//////////////////////
// user Auth
app.use("/api", userAuth);
// user Events
app.use("/userevent", addEvent);
app.use("/userevent", confirmEvent);
app.use("/userevent", notification);
// org Auth
app.use("/api/org", orgAuth);
// org Events
app.use("/api/org", register);
app.use('/graphql', graphqlHTTP({
schema: schema,
graphiql: false
}))
Я больше не знаю, как если я включу graphiql, я смогу получить к нему доступ, просто поставив url+/graphql, так что порты, вероятно, не проблема, и если я что-то пропущу в Procfiles, Heroku выдаст журнал ошибок.
Я думаю, что сервер получает запрос на загрузку параметров до того, как он запустится, поэтому он просто отказывается подключаться. Любой намек на то, как решить это, если это может быть проблемой?
Я запрашиваю данные с помощью graphql у react-apollo в функциональном компоненте, и вот как я печатаю спереди (из реквизита):
var data = schoolsData;
if (data.loading) {
return (<option > Loading Options ...</option>)
} else {
return data && data.schools.map(school => {
return(
<option key = {school.id} value = {school.id}>{school.name}</option>
)
})
}
}
1:
Спасибо, теперь страница стоит на месте, но GraphQL так же отказывается от соединения :(
Добавьте это и дайте мне знать, что он работает нормально:
if (data.loading) {
return (<option > Loading Options ...</option>)
} else {
if (data && data.schools) {
data.schools.map(school => {
return (
<option key = {school.id} value = {school.id}>{school.name}</option>
)
})
}else{
return (<option > Data issue, School is missing! </option>)
}
}
вы сказали, что соединение было отклонено после развертывания, потому что вы используете localhost:8080
в качестве URL-адреса сервера, попробуйте заменить его URL-адресом развернутого сервера.
// index.js
const client = new ApolloClient({
uri: '<server URL>/graphql' // Need to replace <server URL> with server URL
})
ReactDOM.render(
<React.StrictMode>
<ApolloProvider client = {client} >
<Router>
<App />
</Router>
</ApolloProvider>
</React.StrictMode>,
document.getElementById('app')
);
Да, он возвращает «Проблема с данными ...» вместо параметров из базы данных. Может быть, мне следует удалить мгновенный запрос GQL из компонента и написать экспресс-асинхронность ... может быть, запрос настолько немедленный, что сервер не может его обработать?
Если это возможно для вас, вы можете сделать это, как я упоминал выше, если вы используете локальный хост, это также может вызвать эту проблему, если у вас есть отдельный URL-адрес для развернутого сервера, попробуйте заменить его и проверить.
Я не вижу смысла в этом... после развертывания приложения этот локальный хост должен стать новым локальным хостом... если вы понимаете, о чем я. Но так как myapp.herokuapp/graphql доступен, когда graphiql включен, это имеет смысл... Я развертываю банкомат
Теперь вы поняли, что ваши серверы React и Node находятся в Heroku и в среде Heroku, вы сможете получить localhost:8080
для сервера. если это так, это похоже на проблему с данными.
Теперь приложение ничего не возвращает :D Но оно определенно выполняет запрос с кодом состояния 200, но возвращает пустой объект
После изменения материала обработка ошибок на фронте пошла не так, поскольку GraphQL иногда отправляет data.loading: false, тем временем все еще нет данных... исправлено. Однако автоматический вход в систему необходимо переработать. Большое спасибо!
Добавьте условие безопасности, прежде чем делать это,
data && data.schools && data.schools.map
и обработайте условие, в котором вам не хватаетschools