#javascript #node.js #express #graphql #apollo-server
Вопрос:
Я пытаюсь использовать import { applyMiddleware } from 'graphql-middleware';
библиотеку для добавления промежуточного программного обеспечения проверки при вводе мутации.
Итак, я создал пример функции промежуточного программного обеспечения, которая является входом в журнал
export const logInput = async (resolve, root, args, context, info) => {
console.log(`1. logInput: ${JSON.stringify(args)}`);
const result = await resolve(root, args, context, info);
console.log(`5. logInput`);
return resu<
};
Теперь я в соответствии с документацией graphql-middleware
, передаю существующую schemas
и middlewares
applyMiddleware()
которой предоставлена graphql-middleware
библиотека.
graphql/index.js
файл содержит: Итак , этот файл содержит код, который объединяет все schemas
, types
и resolvers
.
import { gql, makeExecutableSchema } from 'apollo-server-express';
import { merge } from 'lodash';
import { GraphQLJSONObject } from 'graphql-type-json';
import { GraphQLDateTime } from 'graphql-iso-date';
import { policyType, policyResolver, policySchema } from './policy';
import {
gitProviderTypes,
gitProviderResolver,
gitProviderSchema,
} from './gitProvider';
const Root = gql`
scalar JSON
scalar JSONObject
scalar GraphQLDateTime
type MyType {
myValue: JSON
myObject: JSONObject
myDate: GraphQLDateTime
}
type Query {
_empty: String
}
type Mutation {
_empty: String
}
schema {
query: Query
mutation: Mutation
}
`;
const resolvers = merge(
{ JSONObject: GraphQLJSONObject, GraphQLDateTime },
policyResolver,
gitProviderResolver
);
export default makeExecutableSchema({
typeDefs: [
Root,
policyType,
policySchema,
gitProviderTypes,
gitProviderSchema,
],
resolvers,
});
Пример файла , который содержит все types
, есть много файлов для обработки других ресурсов
import { gql } from 'apollo-server-express';
export default gql`
type CreatePolicyResult {
id: String
name: String
adopted: Boolean
markdown: String
}
type CreateProcedureResult {
id: String
type: String
name: String
file: String
provider: String
adopted: Boolean
summary: String
guidance: String
applicable: Boolean
}
type Policy {
_id: ID
id: String
name: String
adopted: Boolean
tags: [String]
procedures: [Procedure]
markdown: String
html: String
file: String
}
type Procedure {
_id: ID
id: String
type: String
name: String
summary: String
applicable: String
provider: String
guidance: String
adopted: String
tags: [String!]
markdown: String
html: String
file: String
}
input ProcedureInput {
id: String
type: String
name: String
summary: String
applicable: Boolean
provider: String
guidance: String
adopted: Boolean
tags: [String]
markdown: String
}
input CreateProcedureInput {
id: String!
type: String!
name: String!
markdown: String!
provider: String!
adopted: Boolean!
summary: String
guidance: String
applicable: Boolean!
}
input PolicyInput {
id: String!
name: String!
adopted: Boolean!
markdown: String!
}
input UpdatePolicyInput {
id: String
name: String
adopted: Boolean
tags: [String]
markdown: String
}
input OrganizationInput {
companyFullName: String!
companyShortName: String!
companyEmailDomain: String!
companyWebsiteURL: String!
securityOfficerName: String!
securityOfficerEmail: String!
ctoName: String!
ctoEmail: String!
sourceControl: String!
ticketingSystem: String!
ciSystem: String!
privacyPolicyURL: String!
supportBYODandMDM: Boolean!
}
`;
express.js
file contains:
import { ApolloServer } from 'apollo-server-express';
import { applyMiddleware } from 'graphql-middleware';
import schema from './graphql';
import { logInput } from './graphql/middlewares';
const schemaWithMiddleware = applyMiddleware(schema, logInput);
//Here schema is imported from file and logInput is middleware
//GraphQL Server
const server = new ApolloServer({
schema,
context: async ({ req, res }) => ({ req, res }),
});
Всякий раз, когда я пытаюсь использовать schema
с applyMiddleware()
, выдает ошибку, когда я пытаюсь использовать его напрямую, как это, он работает без каких-либо проблем.
import { ApolloServer } from 'apollo-server-express';
import { applyMiddleware } from 'graphql-middleware';
import schema from './graphql';
import { logInput } from './graphql/middlewares';
//Not using this time, now works without any problem
//const schemaWithMiddleware = applyMiddleware(schema, logInput);
//GraphQL Server
const server = new ApolloServer({
schema: schema,
context: async ({ req, res }) => ({ req, res }),
});
Ошибка броска:
node:14152) UnhandledPromiseRejectionWarning: Error: Schema must contain uniquely named types but contains multiple types named "DateTime".
at new GraphQLSchema (G:nanohealtegopolicy-builder-servicenode_modulesgraphqltypeschema.js:194:15)
at Object.mapSchema (G:nanohealtegopolicy-builder-servicedistutilssrcmapSchema.js:31:12)
at createNewSchemaWithResolvers (G:nanohealtegopolicy-builder-servicedistschemasrcaddResolversToSchema.js:200:14)
at Object.addResolversToSchema (G:nanohealtegopolicy-builder-servicedistschemasrcaddResolversToSchema.js:87:11)
at addMiddlewareToSchema (G:nanohealtegopolicy-builder-servicenode_modulesgraphql-middlewaresrcmiddleware.ts:42:21)
at normalisedMiddlewares.reduceRight.schema.schema (G:nanohealtegopolicy-builder-servicenode_modulesgraphql-middlewaresrcmiddleware.ts:91:11)
at Array.reduceRight (<anonymous>)
at applyMiddlewareWithOptions (G:nanohealtegopolicy-builder-servicenode_modulesgraphql-middlewaresrcmiddleware.ts:80:77)
at Object.applyMiddleware (G:nanohealtegopolicy-builder-servicenode_modulesgraphql-middlewaresrcmiddleware.ts:132:10)
at Object.exports.default (G:nanohealtegopolicy-builder-servicesrcloadersexpress.ts:28:34)
at Object.exports.default (G:nanohealtegopolicy-builder-servicesrcloadersindex.ts:14:24)
at processTicksAndRejections (internal/process/task_queues.js:93:5)
at startServer (G:nanohealtegopolicy-builder-servicesrcserver.ts:16:5)
(node:14152) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:14152) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Я поискал в Интернете, но не смог найти решение.
Комментарии:
1. Ошибка указывает на
mapSchema.js
строку 31. Есть ли этот файл в вопросе, и если да, то какой именно?2.
mapSchema.js
В моем проекте нет файла с таким названием, я думаю, это где-то в какой-то библиотеке3. Этот файл находится в папке dist/utils/src, а не в папке node_modules. Откуда берутся эти файлы? Возможно, это скомпилированный машинописный текст? На этот файл ссылается dist/schema/src/addResolversToSchema.js.
4. Да, я использую здесь машинописный текст, но я не вижу
build
здесь никакой папки. Я использую Nodemon для разработки5. Можете ли вы опубликовать код
dist/utils/src/mapSchema.js
файла, по крайней мере, в строке 31? И строка 200 изdistschemasrcaddResolversToSchema.js
?
Ответ №1:
Странно, но проблема была в этом import { GraphQLDateTime } from 'graphql-iso-date';
пакете.
После удаления его из схемы он начал работать.
import { gql, makeExecutableSchema } from 'apollo-server-express';
import { merge } from 'lodash';
import { GraphQLJSONObject } from 'graphql-type-json';
import { policyType, policyResolver, policySchema } from './policy';
import {
gitProviderTypes,
gitProviderResolver,
gitProviderSchema,
} from './gitProvider';
const Root = gql`
scalar JSON
scalar JSONObject
type MyType {
myValue: JSON
myObject: JSONObject
}
type Query {
_empty: String
}
type Mutation {
_empty: String
}
schema {
query: Query
mutation: Mutation
}
`;
const resolvers = merge(
{ JSONObject: GraphQLJSONObject },
policyResolver,
gitProviderResolver
);
const typeDefs = [
Root,
policyType,
policySchema,
gitProviderTypes,
gitProviderSchema,
];
export default makeExecutableSchema({
typeDefs,
resolvers,
});