#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 и играйте с игровой площадкой перед любым клиентским кодированием … ваши распознаватели не возвращают объект пользователя, результат журнала консоли перед возвратом