0

I can't add object with my app, which is based on some tutorial(however I can do it with graphql playground). Here's my schema and use mutation in AddLaunch component.

const ADD_LAUNCH = gql`
  mutation($flight_number: Int!, 
    $mission_name: String!,
    $launch_year: String!,
    $launch_success: Boolean!,
    $rocket: addRocket!) {
    addLaunch(flight_number: $flight_number,
      mission_name: $mission_name,
      launch_year: $launch_year,
      launch_success: $launch_success,
      rocket:{
        rocket_id: $rocket_id,
        rocket_name: $rocket_name,
        rocket_type: $rocket_type
      }
      ) {
        flight_number
        mission_name
        launch_year
        launch_success
        rocket{
          rocket_id
          rocket_name
          rocket_type
        }
    }
  }
`;

...

const [newLaunch, setNewLaunch] = useState({
    flight_number:'',
    mission_name: '',
    launch_year: '',
    launch_success: null,
    rocket_id:'',
    rocket_name:'',
    rocket_type:''
  });

const [addLaunch] = useMutation(ADD_LAUNCH);

...

const onSubmit = async e => {
    e.preventDefault();
    await addLaunch({ variables: { 
      flight_number: newLaunch.flight_number, 
      mission_name: newLaunch.mission_name,
      launch_year: newLaunch.launch_year,
      launch_success: newLaunch.launch_success,
      rocket:{
        rocket_id: newLaunch.rocket_id,
        rocket_name: newLaunch.rocket_name,
        rocket_type: newLaunch.rocket_type
        }
      } 
    }); 
    refetchLaunches()
  }

My typeDefs:

const typeDefs = gql`
type Rocket {
    rocket_id: String
    rocket_name: String
    rocket_type: String
  },
type Launch {
    _id: ID,
    flight_number: Int,
    mission_name: String,
    launch_year: String,
    launch_date_local: String,
    launch_success: Boolean,
    rocket: Rocket
  },
type Query {
launches: [Launch]
    launch(flight_number:Int!): Launch
  }
input addRocket {
    rocket_id: String!
    rocket_name: String!
    rocket_type: String!
   }
type Mutation {
addLaunch(flight_number: Int!,
        mission_name: String!,
        launch_year: String!,
        launch_success: Boolean!,
        rocket: addRocket!
         ): Launch
`

Resolvers(one mutation):

addLaunch: (parent, launch) => {
      // Create a new record in the database
      const newLaunch = new Launch({ 
        flight_number: launch.flight_number, 
        mission_name: launch.mission_name, 
        launch_year: launch.launch_year, 
        launch_success: launch.launch_success, 
        rocket: launch.rocket 
      });
      // Save the record and return it
      return newLaunch.save();
    }

I tried in many ways, but I can't get any specific information from error( bad request 400).

Wiktor Kujawa
  • 595
  • 4
  • 21
  • pass object to `rocket` variable (with `addRocket` structure) ... in resolver create `new Rocket` object in db before newLaunch (using created rocket [id/relation]) – xadm Jun 04 '20 at 09:36
  • I have found half of answer for this problem. It turned out that I forgot that input with type of number always return string, that is if I write 42 it returns "42"(it only force to write number characters), but I still haven't solve my problem, but maybe some of my previous tries I wrote it correctly, but this flight_number argument blocked it on the start. I'll try it later – Wiktor Kujawa Jun 04 '20 at 22:52

1 Answers1

0

Ok, that is even simpler that I thought. The problem was that I forgot to parse flight_number input value from string to int. Mutation is even simpler than I thought.

const ADD_LAUNCH = gql`
  mutation($flight_number: Int!, 
    $mission_name: String!,
    $launch_year: String!,
    $launch_success: Boolean!,
    $rocket: addRocket!) {
    addLaunch(flight_number: $flight_number,
      mission_name: $mission_name,
      launch_year: $launch_year,
      launch_success: $launch_success,
      rocket: $rocket
      ) {
        flight_number
        mission_name
        launch_year
        launch_success
    }
  }
`;
Wiktor Kujawa
  • 595
  • 4
  • 21