NestJS и GraphQL - TypeError: graphql_1.parse не является функцией с минимальной настройкой - PullRequest
0 голосов
/ 28 сентября 2018

Я начинаю создавать свой первый API с помощью Nest.Я пытаюсь добавить GraphQL, и у меня возникла проблема с самого начала.

TypeError: graphql_1.parse is not a function
    at Object.<anonymous> (C:\Users\marek\dev\eparafie\api-nest\node_modules\apollo-server-core\node_modules\graphql-tools\src\stitching\introspectSchema.ts:7:48)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at Object.<anonymous> (C:\Users\marek\dev\eparafie\api-nest\node_modules\apollo-server-core\node_modules\graphql-tools\src\stitching\index.ts:2:1)
    at Module._compile (internal/modules/cjs/loader.js:689:30)

У меня пока только UsersModule и в его папке у меня есть файл users.graphql:

type Mutation {
    createUser(createUserInput: CreateUserInput): User
}

type User {
    id: Int
    email: String
    password: String
}
input CreateUserInput {
    email: String
    password: String
}

У меня также есть простой преобразователь:

import { UserService } from './user.service';
import { Mutation, Resolver } from '@nestjs/graphql';
import { Body } from '@nestjs/common';
import { CreateUserDto } from '../dto/CreateUserDto';

@Resolver('User')
export class UserResolver {
  constructor(
    private readonly userService: UserService,
  ) {}

  @Mutation()
  async createUser(@Body() createUserDto: CreateUserDto) {
    return await this.userService.create(createUserDto);
  }
}

Мой app.module.ts:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { GraphQLModule } from '@nestjs/graphql';
import { Connection } from 'typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserService } from './user/user.service';
import { RolesService } from './auth/roles.service';
import { MembershipsService } from './auth/memberships.service';
import { UserModule } from './user/user.module';
import { join } from 'path';

@Module({
  imports: [
    TypeOrmModule.forRoot(),
    GraphQLModule.forRoot({
      typePaths: ['./**/*.graphql'],
      definitions: {
        path: join(process.cwd(), 'src/graphql.ts'),
      },
    }),
    UserModule,
  ],
  controllers: [AppController],
  providers: [AppService,
    UserService,
    RolesService,
    MembershipsService,
  ],
})
export class AppModule {
  constructor(private readonly connection: Connection) {}
}

UserModule, если это имеет значение:

import { Module } from '@nestjs/common';
import { User } from './user.entity';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserService } from './user.service';
import { UserResolver } from './user.resolver';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UserService, UserResolver],
  controllers: [],
})
export class UserModule {}

Версии зависимостей:

"dependencies": {
    "@nestjs/common": "^5.3.9",
    "@nestjs/core": "^5.3.10",
    "@nestjs/graphql": "^5.4.0",
    "@nestjs/typeorm": "^5.2.2",
    "apollo-server-express": "^2.1.0",
    "graphql": "^14.0.2",
    "graphql-tools": "^4.0.0",
    "pg": "^7.4.3",
    "reflect-metadata": "^0.1.12",
    "rxjs": "^6.2.2",
    "typeorm": "^0.2.7",
    "typescript": "^3.1.1"
  },
  "devDependencies": {
    "@nestjs/testing": "^5.1.0",
    "@types/express": "^4.16.0",
    "@types/jest": "^23.3.1",
    "@types/node": "^10.7.1",
    "@types/supertest": "^2.0.5",
    "jest": "^23.5.0",
    "nodemon": "^1.18.3",
    "prettier": "^1.14.2",
    "rimraf": "^2.6.2",
    "supertest": "^3.1.0",
    "ts-jest": "^23.1.3",
    "ts-loader": "^4.4.2",
    "ts-node": "^7.0.1",
    "tsconfig-paths": "^3.5.0",
    "tslint": "5.11.0",
    "webpack": "^4.16.5",
    "webpack-cli": "^3.1.0",
    "webpack-node-externals": "^1.7.2"
  },

src / graphql.ts должен быть сгенерирован из моих файлов graphql, верно?Или я что-то упустил?Документация на 100% не ясна по этому поводу, но похоже, что для этого требуются resolver и graphql с типами, и все должно быть в порядке.Я буду очень признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я думаю, что изменение вывода на класс решило мою проблему:

definitions: {
  path: join(process.cwd(), 'src/graphql.schema.ts'),
  outputAs: 'class',
},

(и удалите старые автоматически сгенерированные файлы перед запуском сервера с новым кодом)

еще одна вещь, которую нужно упомянуть, - добавить этот файлисключение узлов узла (в nodemon.json в корневой папке), чтобы избежать повторной загрузки цикла в режиме разработки (при использовании npm run start:dev)

{
  ...
  "ignore": ["src/**/*.spec.ts", "src/graphql.schema.ts"],
  ...
}
0 голосов
/ 10 октября 2018

Измените имя файла наборов на что-то отличное от graphql.ts.

Как это

definitions: {
    path: join(process.cwd(), 'src/gql.ts'),
},
...