NestJS 和 GraphQL - TypeError:graphql_1.parse 不是具有最少设置的函数

Posted

技术标签:

【中文标题】NestJS 和 GraphQL - TypeError:graphql_1.parse 不是具有最少设置的函数【英文标题】:NestJS and GraphQL - TypeError: graphql_1.parse is not a function with minimal setup 【发布时间】:2019-03-04 20:24:06 【问题描述】:

我开始使用 Nest 构建我的第一个 API。 我正在尝试添加 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) 

如果重要,用户模块:

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% 清楚,但看起来需要解析器和带有类型的 graphql,应该没问题。 我将非常感谢任何帮助。

【问题讨论】:

请将错误的堆栈跟踪添加到问题中。 完成。抱歉,我很确定我做到了 看起来graphql 模块加载出了点问题。我试图简单地重现该问题,但没有成功。你能分享一个为你重现问题的存储库吗? @MattMcCutchen 我也有同样的问题。 @AbhinandanN.M.好的;如果您可以提供存储库,我将能够进行调查。 【参考方案1】:

将类型的文件名更改为 graphql.ts 以外的名称。

这样

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

【讨论】:

【参考方案2】:

我认为将输出更改为类解决了我的问题:

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

(并在使用新代码启动服务器之前删除旧的自动生成文件)

另外要提到的是将此文件添加到 nodemon 异常(在根文件夹中的 nodemon.json)以避免在开发模式下重新加载循环(当您使用 npm run start:dev 时)


  ...
  "ignore": ["src/**/*.spec.ts", "src/graphql.schema.ts"],
  ...

【讨论】:

没有。将名称从 graphql.ts 更改为 graphql.schema.ts 解决了您的问题。

以上是关于NestJS 和 GraphQL - TypeError:graphql_1.parse 不是具有最少设置的函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 REST 包装 GraphQL 从 NestJS 提供 GraphQL 和 REST API

NestJS 和 GraphQL - TypeError:graphql_1.parse 不是具有最少设置的函数

错误:使用 Nestjs + Graphql + Typeorm 时无法确定 GraphQL 输入类型

Neo4j 数据库、NestJS 框架和 GraphQL 如何集成?

nestjs : 定义要在 mongoose 和 graphql 中使用的地图/数组

使用graphql的nestJS中的解析器/服务有啥区别?