跟随Ben Awad的lireddit教程配置MikroORM对接Apollo与PSQL遇错求解
配置问题修复方案
1. 修复ApolloServer参数不匹配报错
该报错由版本差异导致:你使用了v4及以上版本的apollo-server-express,而Ben教程使用的是v3版本,新版配置要求补充必填字段,两种修复方式可选:
方式1:兼容新版apollo-server-express
按如下代码修改初始化逻辑:
import { ApolloServer } from '@apollo/server'; import { expressMiddleware } from '@apollo/server/express4'; import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer'; import http from 'http'; // 原有初始化逻辑 const orm = await MikroORM.init<PostgreSqlDriver>(config); await orm.getMigrator().up(); const app = express(); const httpServer = http.createServer(app); // 修正后的ApolloServer配置 const apolloServer = new ApolloServer({ schema: await buildSchema({ resolvers: [HelloResolver, PostResolver], validate: false }), // 补充新版必填的插件配置 plugins: [ApolloServerPluginDrainHttpServer({ httpServer })], }); // 新版要求先启动服务再挂载中间件 await apolloServer.start(); app.use('/graphql', expressMiddleware(apolloServer, { context: () => ({ em: orm.em }) }));
方式2:回退到教程匹配版本
直接安装v3版本即可沿用教程原写法:
npm i apollo-server-express@3.10.3
2. 修复buildSchema的validate属性不存在报错
该报错由type-graphql版本过高导致:2.x版本移除了顶层validate配置项,两种修复方式可选:
方式1:回退到教程匹配版本
npm i type-graphql@1.1.1 reflect-metadata@0.1.13
方式2:适配2.x版本配置
修改buildSchema配置,将validate: false替换为:
validate: { enable: false }
3. 修复PostResolver返回类型不匹配+GraphQL不识别Post解析器问题
第一步:修正em.find的泛型声明
显式指定返回类型匹配Post实体:
@Resolver() export class PostResolver { @Query(() => [Post]) posts(@Ctx() { em }: MyContext): Promise<Post[]> { // 补充泛型声明 return em.find<Post>(Post, {}); } }
第二步:检查Post实体注解
确保同时添加MikroORM和GraphQL的装饰器,漏加@ObjectType会导致GraphQL无法识别Post类型:
import { Entity, PrimaryKey, Property } from "@mikro-orm/core"; import { ObjectType, Field, Int } from "type-graphql"; @ObjectType() // GraphQL类型注解,必填 @Entity() // MikroORM实体注解,必填 export class Post { @Field(() => Int) @PrimaryKey() id!: number; @Field(() => String) @Property() createdAt: Date = new Date(); @Field(() => String) @Property({ onUpdate: () => new Date() }) updatedAt: Date = new Date(); @Field() @Property() title!: string; }
第三步:检查MikroORM配置
确保mikro-orm.config.ts中正确注册了Post实体:
import { Post } from "./entities/Post"; import { Options, PostgreSqlDriver } from "@mikro-orm/postgresql"; export default { // 其他配置省略 entities: [Post], // 也可以用路径匹配写法:entities: ['./dist/entities/*.js'], entitiesTs: ['./src/entities/*.ts'] type: 'postgresql', } as Options<PostgreSqlDriver>;
内容的提问来源于stack exchange,提问作者Mel
相关产品推荐
相关产品推荐

