Я создал локальный пакет с несколькими объектами. этот пакет предназначен для установки через npm в других программах, чтобы использовать общее библиотека объектов. Среди них я создал простой класс для создания AppoloServer, который будет использоваться с сущностями, типами и определителями TypeGraphQL:
export class ClsApolloGraphQlServer {
private _resolvers: any[];
private _connection: Connection;
constructor(
resolvers: any[],
connection: Connection,
) {
this._resolvers = resolvers;
this._connection = connection;
}
public async initApolloServer(
app: express.Application,
corsOpt: cors.CorsOptions
): Promise<ApolloServer> {
const {
typeDefs,
resolvers,
} = await buildTypeDefsAndResolvers({
resolvers: this._resolvers,
});
const schema = makeExecutableSchema({
typeDefs,
resolvers,
});
addSchemaLevelResolveFunction(
schema,
(_, __, context) =>
!!getSession(context, this._SESSION_TYPE)
);
const apolloServer: ApolloServer = new ApolloServer({
schema,
context: ({
req,
res,
}: {
req: Request;
res: Response;
}): IGlobalContext => {
return {
req,
res,
dbConnection: this._connection,
};
},
formatError: (err: GraphQLError) =>
FormatErrorMessageGraphQlServer(err),
});
apolloServer.applyMiddleware({ app, cors: corsOpt });
return apolloServer;
}
}
Дублирование этого кода в одной из конечных программ и импорт класса из этой окончательной версииПрограмма работает нормально.
Однако импорт класса в конечной программе после установки общей библиотеки приводит к сбою TypeGraphQL с ошибкой "Cannot determine GraphQL input type for start
".
Ниже приведен пример распознавателя, которыйпадает, и тип определен для Arg, так как 'start' является аргументом распознавателей для управления нумерацией страниц.
Не знаю, что не так. Просто упомяну, что я импортирую 'рефакт-метаданные' в файл определения класса в библиотеке, а также в самом начале финальной программы.
Resolver
@Query(() => [objectTypeCls], { name: `getAll${suffix}` })
async getAll(
@Ctx() context: IGlobalContext,
@Args() { start, nbRecords }: PaginationArgs
): Promise<TExposeApi[]> {
if (context.dbConnection && context.dbConnection.isConnected) {
const resu: TExposeApi[] = await context.dbConnection
.getRepository<TExposeApi>(objectTypeCls)
.createQueryBuilder(suffix)
.skip(start)
.take(nbRecords)
.getMany();
return resu;
} else return [];
}
ArgType
@ArgsType()
export class PaginationArgs {
@Field(() => Int)
start: number;
@Field(() => Int)
nbRecords: number;
}