GraphQL Отказаться от подключения после развертывания

Я пытался запустить приложение стека MERN на Heroku, в котором я использую как Express, так и GraphQL. Express для аутентификации и обновлений. GraphQL для получения данных для параметров входа (в какую школу вы хотите войти) и сохранения данных в React.Context при входе в систему, которые связаны с пользователем.

Я закончил предложенную часть проекта и развернул приложение на Heroku для тестирования и сбора отзывов.

  • Приложение успешно строится
  • Предоставляются переменные среды для mongodb_uri.

Проблема в том, что когда я открываю приложение, фронт исчезает через несколько секунд, когда сервер отвечает, что соединение GraphQL отклонено. Тем не менее, приложение, работающее на моем компьютере, отлично работает с nodemon с использованием concurrently.

Я совершенно безнадежен, так как:

  • Приложение, использующее CORS
  • график неверный

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:

Добавьте условие безопасности, прежде чем делать это, data && data.schools && data.schools.map и обработайте условие, в котором вам не хватает schools

kgangadhar 11.12.2020 17:57

Спасибо, теперь страница стоит на месте, но GraphQL так же отказывается от соединения :(

Krisztian Nagy 11.12.2020 18:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
1 950
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавьте это и дайте мне знать, что он работает нормально:

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 из компонента и написать экспресс-асинхронность ... может быть, запрос настолько немедленный, что сервер не может его обработать?

Krisztian Nagy 11.12.2020 18:24

Если это возможно для вас, вы можете сделать это, как я упоминал выше, если вы используете локальный хост, это также может вызвать эту проблему, если у вас есть отдельный URL-адрес для развернутого сервера, попробуйте заменить его и проверить.

kgangadhar 11.12.2020 18:26

Я не вижу смысла в этом... после развертывания приложения этот локальный хост должен стать новым локальным хостом... если вы понимаете, о чем я. Но так как myapp.herokuapp/graphql доступен, когда graphiql включен, это имеет смысл... Я развертываю банкомат

Krisztian Nagy 11.12.2020 18:29

Теперь вы поняли, что ваши серверы React и Node находятся в Heroku и в среде Heroku, вы сможете получить localhost:8080 для сервера. если это так, это похоже на проблему с данными.

kgangadhar 11.12.2020 18:31

Теперь приложение ничего не возвращает :D Но оно определенно выполняет запрос с кодом состояния 200, но возвращает пустой объект

Krisztian Nagy 11.12.2020 18:35

После изменения материала обработка ошибок на фронте пошла не так, поскольку GraphQL иногда отправляет data.loading: false, тем временем все еще нет данных... исправлено. Однако автоматический вход в систему необходимо переработать. Большое спасибо!

Krisztian Nagy 11.12.2020 19:22

Другие вопросы по теме