Как исправить ошибку «Не удается прочитать свойство 'id' из NULL" в JavaScript? - PullRequest
0 голосов
/ 21 декабря 2018

Я слежу за учебником Аполлона.Конечным результатом является интерактивное приложение, которое позволяет зарегистрированным пользователям зарезервировать место для предстоящего запуска Space-X.

Я только что закончил писать три средства разрешения мутаций: login, bookTrips и cancelTrip.https://www.apollographql.com/docs/tutorial/resolvers.html#mutation

Проверка bookTrips с массивом объектов из 3 идентификаторов в качестве аргумента приводит к ошибке.https://graphqlbin.com/v2/K1V7ir

Тестирование распознавателя входа в систему работает https://graphqlbin.com/v2/K1V7ir

Тестирование cancelTrip работает https://graphqlbin.com/v2/K1V7ir

Я несколько раз просматривал свой код в поисках опечатки.Я закомментировал свою версию кода и скопировал / вставил код, указанный в учебном пособии, по-прежнему получаю ту же ошибку.

внутри src / resolvers.js

bookTrips: async (_, { launchIds }, { dataSources }) => {
        const results = await dataSources.userAPI.bookTrips({ launchIds });
        const launches = await dataSources.launchAPI.getLaunchesByIds({
            launchIds,
        });

        return {
            success: results && results.length === launchIds.length,
            message: results.length === launchIds.length
                ? 'trips booked successfully'
                : `the following launches could not be booked: ${launchIds.filter(
                    id => !results.includes(id),
                )}`,
            launches,
        };
    },
cancelTrip: async (_, { launchId }, { dataSources }) => {
        const result = dataSources.userAPI.cancelTrip({ launchId });

        if (!result) 
            return {
                success: false,
                message: 'failed to cencel trip',
            };

        const launch = await dataSources.launchAPI.getLaunchById({ launchId });
        return {
            success: true,
            message: 'trip cancelled',
            launches: [launch],
        };
    },
},

внутри src / datasources / launch.js

// returns several launches based on their respective launchIds
getLaunchByIds({ launchIds }) {
    return Promise.all(
        launchIds.map(launchId => this.getLaunchById({ launchId })),
    );
}

// method takes in a flight number and returns the data for a particular launch
    async getLaunchById({ launchId }) {
        const res = await this.get('launches', { flight_number: launchId });
        return this.launchReducer(res[0]);
    }

// transform launch data into a shape the schema expects
    launchReducer(launch) {
        return {
            id: launch.flight_number || 0,
            cursor: `${launch.launch_date_unix}`,
            site: launch.launch_site && launch.launch_site.site_name,
            mission: {
                name: launch.mission_name,
                missionPatchSmall: launch.links.mission_patch_small,
                missionPatchLarge: launch.links.mission_patch,
            },
            rocket: {
                id: launch.rocket.rocket_id,
                name: launch.rocket.rocket_name,
                type: launch.rocket.rocket_type,
            },
        };
    }

внутри src / datasources / user.js

 // Takes an object with an array of launchIds and books them for the logged in user
 async bookTrips({ launchIds }) {
  const userId = this.context.user.id;
   if (!userId) return;

   let results = [];

// for each launch id, try to book the trip and add it to the results array
// if successful
for (const launchId of launchIds) {
  const res = await this.bookTrip({ launchId });
  if (res) results.push(res);
}

return results;

}

После запуска этого на моей игровой площадке graphql

 mutation BookTrips {
  bookTrips(launchIds: [67,68,69]) {
   success
   message
   launches {
    id
   }
  }
 }

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

1 Ответ

0 голосов
/ 21 декабря 2018

Похоже, пользователь не найден.Попробуйте изменить

async bookTrips({ launchIds }) {
    const userId = this.context.user.id;

на

async bookTrips({ launchIds }) {
    const userId = this.context.user && this.context.user.id;
...