javascript - Apollo GraphQL 解析器类型签名中的 info 参数为空
问题描述
我正在开发这个名为 Wertik JS 的库https://github.com/ilyaskarim/wertik-js,以更轻松地制作 GraphQL + Rest API,在解析器中,当我控制台 log 时info
,它显示未定义。对于每个模块,我都创建了动态解析器,以便让使用该库的开发人员更轻松。
let object = {
create: async (_:any, args:any, context:any,info: any) => {
console.log(info); // This will be undefined
let v = await validate(validations.create,args.input);
let {success} = v;
if (!success) {
throw new ApolloError("Validation error",statusCodes.BAD_REQUEST.number,{list: v.errors})
}
try {
let createModel = await model.create(args.input);
pubsub.publish(`${camelCase(moduleName)}Created`, { [`${camelCase(moduleName)}Created`]: createModel });
return createModel;
} catch (e) {
return internalServerError(e);
}
},
}
该信息在 Apollo 服务器文档https://www.apollographql.com/docs/apollo-server/essentials/data/#resolver-type-signature中进行了描述,其中说:此参数包含有关查询执行状态的信息,包括字段名称、从根到字段的路径等。不幸的是,对我来说,它变得不确定。
要重现该问题:
- 下载https://github.com/ilyaskarim/wertik-js/tree/development
- 纱线安装
- 转到示例/演示
- 跑
node index.js
- 现在去http://localhost:1209/
例如输入这个突变:
突变 { createRole(input: {name: "Asd"}) { name } }
- 此行在此突变上执行https://github.com/ilyaskarim/wertik-js/blob/ec813f49a14ddd6a04680b261ae4ef2aadc2b1a5/src/framework/dynamic/resolvers.ts#L102
- 并在控制台上返回 undefined。
这就是我设置应用程序的方式:
const { ApolloServer } = require('apollo-server');
import mutations from "./loadAllMutations";
import queries from "./loadAllQueries";
import resolvers from "./loadAllResolvers";
import subscriptions from "./loadAllSubscriptions";
import schemas from "./loadAllSchemas";
import generalSchema from "./../helpers/generalSchema";
export default function (rootDirectory: string,app: any,configuration: object) {
let allMutations = mutations(rootDirectory);
let allQueries= queries(rootDirectory);
let allSchemas = schemas(rootDirectory);
let allResolvers = resolvers(rootDirectory);
let allSubscriptions = subscriptions(rootDirectory);
let {validateAccessToken} = require(`${rootDirectory}/framework/predefinedModules/user/auth`).default;
let mainSchema = `
${generalSchema}
${allSchemas}
type Subscription {
${allSubscriptions}
}
type Mutation {
${allMutations}
}
type Query {
${allQueries}
}
schema {
query: Query
mutation: Mutation
subscription: Subscription
}
`;
const server = new ApolloServer({
typeDefs: mainSchema,
resolvers: allResolvers,
context: async (a: any) => {
await validateAccessToken(a.req);
}
});
server.listen(1209).then(({ url, subscriptionsUrl }) => {
console.log(`Server ready at ${url}`);
console.log(`Subscriptions ready at ${subscriptionsUrl}`);
});
}
可能的原因是什么?
解决方案
您正在截断此模块内的解析器接收到的参数。如果您需要将函数分配给某个对象属性,最好这样做:
mutations: {
[`create${moduleName}`]: mutations[`create${moduleName}`],
},
这不仅更简洁,而且还意味着您不会冒意外遗漏参数的风险,这就是这里发生的情况。
推荐阅读
- c# - API 中的哪里是 ApiName 的值,用于分配 IdentiyServer4 的授权?
- node.js - React API 调用状态永远挂起
- sorting - QGIS如何永久更改记录顺序?(对记录/特征进行永久排序并输出一个新的 shapefile)
- apache-spark - Spark 表和 Ranger Row 过滤
- javascript - 进行排序并加载更多系统(NodeJS 路由 + MySQL)
- c++ - 指向方法问题的指针
- javascript - react-datepicker 没有正确显示日期
- c# - Unity C#-rigidbody.moveposition 的 Lerp 问题
- reactjs - Firebase:在“firebase/app”中找不到“firebase”
- php - 如何以正确的方式在 foreach 中实现 REGEXP?