@graphql_ru
GraphQL — русскоговорящее сообщество

Общаемся на темы, посвященные GraphQL и опыту его использования. Проблемы. Новости. Решения. Вам могут быть полезны: @apollo_ru, @react_js, @vuejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание в чате было полезным и комфортным.

352 members

Архив канала @graphql_ru 28 июня 2018 г.

06:26:32 ДП
User 341172775
User 124962553
где-то читал что facebook ни шлет все тело запроса в проде. Они просто создают при сборке прода уникальный id для каждого запроса и юзают их. Канает правда только для случая если апи закрытое
В принципе да, можно закрыть все внутри что бы для пользователя было магией, но при этом теряешь лёгкость и гибкость))) мир не идеален(
06:38:25 ДП
User 124962553
User 341172775
В принципе да, можно закрыть все внутри что бы для пользователя было магией, но при этом теряешь лёгкость и гибкость))) мир не идеален(
какую гибкость? Гибкость нужна только при разработке, в проде она не нужна. Опять же повторюсь, если апи закрыто
06:39:04 ДП
User 341172775
Ну тебе для прода придется доп код писать
08:35:36 ДП
User 124962553
User 341172775
Ну тебе для прода придется доп код писать
писать код - это наша работа)
08:38:56 ДП
User 124962553
User 207858668
так при апдейте фрагмента у тебя лист сам должен заапдейтиться, если он содержит этот фрагмент
Как то странно получается. Получаю с сервера продукт, добавляя ему локально флаг inCart(через фрагмент), после нажатия на кнопку обвляю списко товаров в корзине, и обновляю фрагмент  для товара. Пока все ок. Но, если теперь удалить товар из корзины и попытаться добавить его же еще раз, то получаю ошибку Network error: Can't find field listing({"id":2028679088}) on object (ROOT_QUERY)
09:43:20 ДП
User 207858668
User 124962553
Как то странно получается. Получаю с сервера продукт, добавляя ему локально флаг inCart(через фрагмент), после нажатия на кнопку обвляю списко товаров в корзине, и обновляю фрагмент  для товара. Пока все ок. Но, если теперь удалить товар из корзины и попытаться добавить его же еще раз, то получаю ошибку Network error: Can't find field listing({"id":2028679088}) on object (ROOT_QUERY)
Почему флаг не через резолвер изначально добавляешь?
09:44:45 ДП
User 124962553
User 207858668
Почему флаг не через резолвер изначально добавляешь?
через резолвер. Но с проблемой разобрался
02:15:11 ПП
User 477528844
Получаю такую ошибку когда делаю мутацию: GraphQL error: secretOrPrivateKey must have a value, но мутация совершается успешно и сохраняется в бд. С чем это может быть связано?
02:16:03 ПП
User 341172775
тем что не передаешь значение а где то у тебя стоит secretOrPrivateKey!
02:16:05 ПП
User 477528844
Когда пытаюсь совершить мутацию с такими же данными, получаю другую ошибку GraphQL error: A unique constraint would be violated on User. Details: Field name = nickname, что доказывает то что прошлая мутация прошла успешно и юзер был зареган
02:18:08 ПП
User 477528844
User 341172775
тем что не передаешь значение а где то у тебя стоит secretOrPrivateKey!
только что проверил, secretOrPrivateKey! нигде не стоит

но может быть это из-за того, что я в призме указал secret, при запуске сервера тоже передал, а вот при запросе с фронта - нет?
02:18:41 ПП
User 206966715
User 477528844
Получаю такую ошибку когда делаю мутацию: GraphQL error: secretOrPrivateKey must have a value, но мутация совершается успешно и сохраняется в бд. С чем это может быть связано?
А что в резолвере возвращается? Вполне возможно создать новую запись, но на клиент вернуть не тот payload
02:18:43 ПП
User 341172775
с призмой не работал, не знаю
02:19:53 ПП
User 206966715
User 206966715
А что в резолвере возвращается? Вполне возможно создать новую запись, но на клиент вернуть не тот payload
Если АПИ ручками пишется
02:19:57 ПП
User 477528844
User 206966715
А что в резолвере возвращается? Вполне возможно создать новую запись, но на клиент вернуть не тот payload
signup(
    email: String!
    password: String!
    nickname: String!
    name: String
  ): AuthPayload!

ты про это?
02:20:21 ПП
User 477528844
signup: async(_, args, context, info) => {
      const password = await bcrypt.hash(args.password, 10);
      const user = await context.prisma.mutation.createUser({
        data: {
          email: args.email.toLowerCase(),
          password: password,
          nickname: args.nickname.toLowerCase(),
          name: args.name,
        },
      });

      return {
        token: jwt.sign({ userId: user.id }, process.env.APP_SECRET),
        user,
      };
    },

или это?)
02:20:50 ПП
User 477528844
User 477528844
signup: async(_, args, context, info) => {
      const password = await bcrypt.hash(args.password, 10);
      const user = await context.prisma.mutation.createUser({
        data: {
          email: args.email.toLowerCase(),
          password: password,
          nickname: args.nickname.toLowerCase(),
          name: args.name,
        },
      });

      return {
        token: jwt.sign({ userId: user.id }, process.env.APP_SECRET),
        user,
      };
    },

или это?)
https://gist.github.com/SilencerWeb/c27340428ca63793500bec716c5aaefe
gist.github.com/SilencerWeb/c27340428ca63793500bec716c5aaefe
GitHub is where people build software. More than 28 million people use GitHub to discover, fork, and contribute to over 85 million projects.
02:21:52 ПП
User 477528844
type User {
  id: ID! @unique
  email: String! @unique
  password: String!
  nickname: String! @unique
  name: String
  createdAt: DateTime!
  updatedAt: DateTime!
}
02:23:10 ПП
User 206966715
User 477528844
https://gist.github.com/SilencerWeb/c27340428ca63793500bec716c5aaefe
gist.github.com/SilencerWeb/c27340428ca63793500bec716c5aaefe
GitHub is where people build software. More than 28 million people use GitHub to discover, fork, and contribute to over 85 million projects.
А этот createUser из контекста как выглядит?
02:23:22 ПП
User 477528844
User 206966715
А этот createUser из контекста как выглядит?
02:23:39 ПП
User 477528844
это результат, занесенный в переменную user
02:24:56 ПП
User 477528844
бля, я в ахуе, наконец-то догнал
02:25:04 ПП
User 206966715
Просто единственное объяснение, которое я вижу - косяк внутри метода createUser
02:25:14 ПП
User 206966715
User 477528844
бля, я в ахуе, наконец-то догнал
Так что там?
02:25:36 ПП
User 477528844
process.env.APP_SECRET пуст :))
02:25:55 ПП
User 477528844
я занес все эти переменные в config.js чтобы было удобнее юзать, а поменять тут забыл, вот и не работало
02:26:14 ПП
User 477528844
спасибо большое :) я б даже не полез трогать этот код сам
02:26:50 ПП
User 206966715
А, ошибка же про key была. Логично
02:27:33 ПП
User 477528844
ну это жесть, конечно)
10:14:46 ПП
User 224769697
а как в аполло организовать вычисляемые поля на клиенте? например если есть data.profile.user.id то ставить authorized: true
10:28:19 ПП
User 224769697
и что делать если кверя такая:
10:28:23 ПП
User 224769697
const checkAuthQuery = gql`
  query {
    me {
      state {
        user {
          id
          firstName
          lastName
          middleName
          avatarUrl
        }
      }
    }
  }
`;
10:28:43 ПП
User 224769697
а данные, хочется чтобы вернула, такие:

user {
          id
          firstName
          lastName
          middleName
          avatarUrl
        }
10:28:51 ПП
User 224769697
без вложенности с me.state
10:36:54 ПП
User 207858668
User 224769697
а как в аполло организовать вычисляемые поля на клиенте? например если есть data.profile.user.id то ставить authorized: true
apollo-link-state
можно писал свои резолверы для добавления клиентских полей
10:37:36 ПП
User 224769697
воот, это вручную нужно будет вызывать эти ресолверы? или можно както привязать к обновлению определенных полей в кеше?
10:38:29 ПП
User 207858668
глубоко с этим не разбирался, но они будут точно вызываться после фетча данных с сервера
10:39:01 ПП
User 207858668
в кверю можно прям добавить authorized @client
и написать кастоный резолвер для этого поля