Apollo Server, Graphql - должен предоставить строку запроса - PullRequest
0 голосов
/ 07 января 2019

Я не уверен, что я здесь делаю не так? Сейчас я застрял в течение некоторого времени, чтобы мои мутации работали с моей apollo-server-lambda в моей бессерверной установке, мои запросы работают нормально, когда я пытаюсь выполнить такой запрос:

{ "mutation": "{ signIn(username: \"SomeUser\", password: \"SomePassword\" ) { token } }" }

Я просто получаю сообщение: «Должен предоставить строку запроса». статус 400.

Я настроил свой резольвер так:

const resolvers = {
  Query: {
    users: async (_, args, ctx) => User.load(args, ctx)
  },

  Mutation: {
    signIn: async (_, { username, password }, ctx) => Auth.signIn({ username, password }, ctx)
  }
};

Для дополнительной информации вот мои typeDefs:

const typeDefs = gql`
  type User {
    id: ID!,
    firstname: String,
    lastname: String,
    username: String,
    createdAt: String,
    role: String
  }

  type AuthToken {
    token: String
  }

  type Query {
    hello: String,
    users(id: Int): [User]
  }

  type Mutation {
    signIn(username: String!, password: String!): AuthToken!
  }
`;

Я использую почтальон для проверки моей конечной точки graphql, и мой тип контента - application / json

Я не знаю, может ли кто-нибудь здесь сказать мне, что я делаю неправильно, я попытался переместить все это в Query resolver, и это работает, заменив тогда «мутация» на «запрос», но это не имеет смысла для меня, используя « запрос "здесь, и я думаю, позже, когда я на самом деле хочу использовать мутацию для изменения данных, мне нужно, чтобы это работало в любом случае?

Может кто-нибудь сказать мне, где я здесь не так?

EDIT

Я установил: graphql-playground-middleware-lambda и установил настройки без сервера с помощью: https://github.com/prisma/graphql-playground#as-serverless-handler, и если я использую Graphiql, он работает как задумано, но мне все еще интересно, если кто-нибудь знает, что не так с json, который я посылаю через почтальона

1 Ответ

0 голосов
/ 07 января 2019

При отправке запроса ваше тело запроса должно быть правильно отформатированным объектом JSON со свойством query (и, необязательно, свойством variables, если включены переменные):

{
  "query": "<GraphQL Document>",
  "variables {},
}

Это тот случай, если сама операция является query или mutation.

Фактическое значение свойства query выше должно быть синтаксически правильным документом , как указано в спецификации GraphQL . Документ обычно состоит из одного определения операции (query или mutation), которое включает в себя все запрошенные поля для этой операции. Документ также будет включать фрагменты, если они используются.

Определение операции выглядит так:

OperationType [Name] [VariableDefinitions] [Directives] SelectionSet

Таким образом, у вас может быть такой документ:

mutation SomeMutation {
  signIn(username: "SomeUser", password: "SomePassword") {
    token
  }
}

Здесь тип операции равен mutation, имя равно SomeMutation, а все, что находится между крайним набором фигурных скобок, является набором выбора . Если бы у вас были какие-либо переменные, их типы были бы объявлены в скобках перед набором выбора.

Имя операции необязательно, но полезно включить его для целей отладки в бэкэнд. Технически, тип операции также может быть опущен, и в этом случае GraphQL просто предполагает, что тип является запросом. Например, это все еще действительный документ:

{
  users {
    id
  }
}

и эквивалентно

query SomeName {
  users {
    id
  }
}

Первый из них упоминается как сокращение запроса . Очевидно, что это не может быть использовано для мутаций, поэтому мутации всегда должны явно указывать свой тип операции. Полный пример:

{
  "query": "mutation SomeName ($username: String!, $password: String!) { signIn(username: $username, password: $password) { token } }",
  "variables {
    "username": "SomeUser",
    "password": "SomePassword"
  },
}
...