экспресс-ошибка http: 500 при мутации graphql для создания пользователя из клиента apollo в react

#node.js #reactjs #express #graphql #apollo

Вопрос:

пытаюсь добавить пользователя, использующего мутацию graphql в apollo, но мой сервер выдает мне: Uncaught (in promise) Error: Response not successful: Received status code 500 не уверен, нужно ли мне указывать сервер для использования маршрута post или нет? Я подумал, что если вы просто скажете express использовать graphql на определенном маршруте, то есть /graphql, он будет считывать запросы на мутации по мере необходимости

не знаю, почему мой сервер отправляет мне сообщение об ошибке 500. В качестве примечания я могу без проблем получать пользователей со своего сервера, используя apollo в своем приложении react

в надежде, что кто-нибудь подскажет мне, что случилось с моим экспресс-приложением, которое может вызвать мою проблему, я попытался добавить маршрут отправки, как вы увидите в примере, но я все равно получаю сообщение об ошибке 500

Мутация Apollo в react

 import {gql} from '@apollo/client';  export const CREATE_CUSTOMER_MUTATION = gql` mutation addCustomer($id: Int! $name: String! $email: String! $age: Int!){  addCustomer  (id: $id name: $name email: $email age: $age)  {  id  name  email  age  } }  `  

Форма в react для добавления пользователя

 import React, {useState} from 'react' import { CREATE_CUSTOMER_MUTATION } from '../GraphQL/Mutations' import { useMutation } from '@apollo/client';  export default function Form() {  const [id,setId] = useState("");  const [name,setName] = useState("");  const [email,setEmail] = useState("");  const [age,setAge] = useState("");   const [addCustomer, {error}] = useMutation(CREATE_CUSTOMER_MUTATION)  const newCustomer = () =gt;{  addCustomer({  variables: {  id: id,  name: name,  email: email,  age: age  }  })  if(error){  console.log(error);  }  };   return (  lt;divgt;  lt;input type="text"  placeholder="id"  onChange = {(e) =gt;{  setId(e.target.value)}}/gt;   lt;input type="text"  placeholder="name"  onChange = {(e) =gt;{  setName(e.target.value)}}/gt;   lt;input type="text"   placeholder="email"  onChange = {(e) =gt;{  setEmail(e.target.value)}}/gt;   lt;input type="text"   placeholder="age"  onChange = {(e) =gt;{  setAge(e.target.value)}}/gt;  lt;button onClick={addCustomer}gt;Create Customerlt;/buttongt;    lt;/divgt;  ) }    

EXPRESS SERVER

 const express = require('express') const expressGraphQL = require('express-graphql').graphqlHTTP const schema = require('./schema.js') const cors = require('cors') const port = process.env.PORT || 3000   const app = express(); //allow CORS app.use(cors())   app.use('/graphql', expressGraphQL({  schema:schema,  graphiql:true, }));   app.get('/', (req, res) =gt; {  res.send('Hello World!')  })   app.listen(port, ()=gt;{  console.log(`server is running on port ${port}`) });   

моя схема graphql на моем экспресс-сервере

 const axios = require('axios') const {  GraphQLObjectType,  GraphQLString,  GraphQLInt,  GraphQLSchema,  GraphQLList,  GraphQLNonNull  } = require('graphql')   //hardcoded data  const customers =[  {id: 1, name: 'luther wardle', email: 'lwardle@mail.com', age:35},  {id: 2, name: 'steve smith', email: 'ssmith@mail.com', age:30},  {id: 3, name: 'the main mayne', email: 'itme@mail.com', age:29},  {id: 4, name: 'jojo mojo', email: 'jmojo@mail.com', age:14}  ]   //customer type const CustomerType = new GraphQLObjectType({  name: 'Customer',  fields: () =gt;({  id: {type:GraphQLString},  name: {type:GraphQLString},  email: {type:GraphQLString},  age: {type: GraphQLInt}  }) })  //Root Query const RootQuery = new GraphQLObjectType({  name: 'RootQueryType',  fields:{  customer: {  type:CustomerType,  args:{  id: {type:GraphQLString}  },  resolve(parentValue,args){    for(let i =0; ilt;customers.length; i  ){  if(customers[i].id == args.id){  return customers[i]  }  }      }  },   customers:{  type: new GraphQLList(CustomerType),  resolve(parentValue,args){    return customers  }   }  }   }); //mutation const mutation = new GraphQLObjectType({  name: 'mutation',  fields:{  addCustomer:{  type:CustomerType,  args:{  id: {type: new GraphQLNonNull(GraphQLInt)},  name: {type: new GraphQLNonNull(GraphQLString)},  email: {type: new GraphQLNonNull(GraphQLString)},  age: {type: new GraphQLNonNull(GraphQLInt)}    },  resolve(parentValue,args){    // add to the list  return customers  }  },  deleteCustomer:{  type:CustomerType,  args:{  id:{type: new GraphQLNonNull(GraphQLString)}  },  resolve(parentValue,args){  return axios.delete('http://localhost:3000/customers/' args.id)  .then(res =gt; res.data);  }  },  editCustomer:{  type:CustomerType,  args:{  id:{type: new GraphQLNonNull(GraphQLString)},  name:{type: GraphQLString},  email:{type:GraphQLString},  age:{type: GraphQLString}  },  resolve(parentValue,args){  return axios.patch('http://localhost:3000/customers/' args.id,args)  .then(res =gt; res.data);  }  }  } })  module.exports = new GraphQLSchema({  query: RootQuery,  mutation });  

Комментарии:

1. Можете ли вы включить сюда что-нибудь о том, какую ошибку вы на самом деле получаете? Обратите внимание, что вам не нужен почтовый маршрут. Приложение.use делает это за вас.

2. Я внес некоторые изменения, так как понял, что не указал идентификатор в качестве переменной, но я использую жестко закодированные данные, поэтому ничто не обрабатывает идентификатор для меня… Я также опубликовал сообщение об ошибке, которое я получаю, и удалил маршрут сообщения, единственная информация, которую я получаю, заключается в том, что ответ плохой Uncaught (in promise) Error: Response not successful: Received status code 500 , извините, если это не очень полезно XD Я знаю это чувство

3. Я скажу, что у меня нет проблем с возвращением всех клиентов с сервера, только мутации вызывают эту проблему, что заставляет меня думать, что проблема в моем запросе, но для меня это выглядит нормально

4. У вас включен GraphiQL. Можете ли вы сделать запрос непосредственно к API и получить лучший стек ошибок?

5. спасибо за подсказку, после небольшого исследования я обнаружил, что моя форма передавала все переменные в виде строк, когда ID и возраст должны были быть Int, после анализа Int проблема была решена 🙂

Ответ №1:

моя форма передавала все переменные в виде строк, когда ID и возраст должны были быть Int, после анализа Int проблема была решена

как показано ниже, я изменил переменные внутри своего компонента формы

   const newCustomer = () =gt;{  addCustomer({  variables: {  id: parseInt(id),  name: name,  email: email,  age: parseInt(age)  }  })  if(error){  console.log(error);  }  };