Как я могу получить доступ к данным в GraphQL, если не по идентификатору?

#meteor #graphql #apollo-client #graphql-js

Вопрос:

Я использую GraphQL с Meteor и Pup v2, и у меня проблема с доступом к данным пользователей с помощью специального идентификатора, предоставляемого каждому пользователю при регистрации, этот идентификатор будет использоваться в ссылке (mysite.com/user/specialId), чтобы другие пользователи могли просматривать учетную запись искомых пользователей. Проблема в том, что я не могу получить данные со специальным идентификатором, я не могу получить какие-либо данные обратно, если я не передам _id пользователей, предоставленный MongoDB. Ниже у меня есть куча используемого кода:

Попытка 1

Я попытался использовать пользовательский способ на ходу, чтобы иметь возможность, по крайней мере, получить доступ к данным, чтобы увидеть, работает ли он (а затем правильно реализовать его позже).

 const GET_USER_DETAILS = gql`
  query user($userId: String) {
  user(userId: $userId) {
    userId
    username
    _id
  }
}
`;
 

Здесь я экспортирую, чтобы получить данные:

 export default compose(
     graphql(GET_USER_DETAILS, {
        options: ({ match }) => ({
          fetchPolicy: 'no-cache',
          variables: {
            // existing specialId for testing purposes, to be replaced with match.params.userId
            userId: "J4xZzvvhBDSEufnBn",
          },
        }),
      }),
)(PublicProfileView);
 

Это возвращает ошибку 400 Network error: Response not successful: Received status code 400 error , и после нескольких попыток я не смог ее исправить, поэтому я попробовал другой подход…

Попытка 2

Я попытался углубиться в файлы и изменить GraphQL. Создан новый запрос:

 query userById($userId: String) {
  userById(userId: $userId) {
    ...UserAttributes
  }
}
 

(Упомянутый фрагмент)

 fragment UserAttributes on User {
  _id
  name {
    ... 
  }
  username
  emailAddress
  oAuthProvider
  roles {
    ...
  }
  settings {
   ...
  }
  userId
}
 

Tried to add new item in API:

 type Query {
   ...
   userById(userId: String): User
   ...
}
 

Resolver:

 resolvers: {
  Query: {
    ...
    userById: (parent, args) => {
      // Assuming args equals an object like { _id: '123' };
      return UserQueries.userById(args);
    },
  },
},
 

query.js, attempt 1:

 userById: (parent) => queryUsers.find({ userId: parent.userId }, { sort: { createdAt: 1 } }).fetch()
 

Attempt 2:

 userById: (parent, args, context) => {
  return queryUsers({
    
    userId: parent.userId,
  });
},
 

And finally

Attempt 3

Я попытался изменить запрос get

 const getQueryModified = (options) => {
  // console.log(options.userId)
  try {
    return options.userId
      ? { 'userId': options.userId }
      : { userId: options.userId };
  } catch (exception) {
    throw new Error(`[queryUsers.getQuery] ${exception.message}`);
  }
};
 

Вот исходный запрос, который я пытался изменить:

 const getQuery = (options) => {
  try {
    return options.search
      ? {
          _id: { $ne: options.currentUser._id },
          $or: [
            { 'profile.name.first': options.search },
            { 'profile.name.last': options.search },
            { 'emails.address': options.search },
            // { 'userId': options.search },
            { 'services.facebook.first_name': options.search },
            { 'services.facebook.last_name': options.search },
            { 'services.facebook.email': options.search },
          ],
        }
      : { _id: options.currentUser._id };
  } catch (exception) {
    throw new Error(`[queryUsers.getQuery] ${exception.message}`);
  }
};
 

К сожалению, это также не увенчалось успехом, лучшее, что я получаю от них при выполнении приведенного ниже запроса, равно нулю…

 userById(userId: "J4xZzvvhBDSEufnBn"){
  username
}
 

Все, что я хочу, это получить пользовательские данные из их идентификатора пользователя, а не из их _id, но я, похоже, не могу понять, как это сделать

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

1. следуйте некоторым [более подробным] учебным пособиям только для BE/server и играйте с игровой площадкой перед любым клиентским кодированием … ваши распознаватели не возвращают объект пользователя, результат журнала консоли перед возвратом