Сервер Apollo — как создать и добавить объект в распознавателе, когда тип недоступен в пространстве имен

#apollo #apollo-server

#apollo #apollo-сервер

Вопрос:

В следующем примере я пытаюсь создать сообщение и добавить его в словарь ‘post’. Как ожидается, что мутация создаст, добавит к хэшу и вернет тип элемента, созданного, когда тип элемента недоступен для пространства имен преобразователя?

 mutation createPost {
  createPost(input: {name: "Post Name"}){
    name
  }
}
  

index.js:

 const { ApolloServer, gql } = require('apollo-server');
const dictionary = {};
const typeDefs = gql`

    input PostSpecInput {
        name: String
    }

    type PostSpec {
        id: ID!
        name: String
    }

    type Mutation {
          createPost(input: PostSpecInput): PostSpec
    }

    type Query {
        post_specs: [PostSpec]
    }
`;

const resolvers = {
    Query: {
        post_specs: () => Object.keys(dictionary).map(function(key){
            return dictionary[key];
        })
    },
    Mutation: {
        createPost(parent, args, context, info) {
            var id = require('crypto').randomBytes(10).toString('hex');
                const postSpec = new PostSpec(id, args.input);
                posts_mock_database[id] =  args.input;
                return postSpec;
            }
      }
}

const server =  new ApolloServer({typeDefs, resolvers})

server.listen().then(({url}) => {
    console.log(`Server Ready at ${url}`);
})
  

Ошибка:

 {
  "errors": [
    {
      "message": "PostSpec is not defined",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "createPost"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "stacktrace": [
            "ReferenceError: PostSpec is not defined",
            "    at createPost (index.js:38:34)",
  

Ответ №1:

Определения типов не являются ни классами, ни экземплярами объектов, они предназначены только для принудительного ввода типа. Даже если бы вы находились в пространстве имен, вызов ‘new’ не сработал бы. Вот решение для вашей макетной базы данных:

  Mutation: {
        createPost(parent, args, context, info) {
            var id = require('crypto').randomBytes(10).toString('hex');
                const newPostSpec = { id: id, name: args.input.name }
                posts_mock_database[id] = newPostSpec;
                return newPostSpec;
            }
      }
  

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

1. Это действительно прояснило фундаментальное непонимание базовой конструкции.