如何通过Resolver在GraphQL查询中添加动态字段fullName?
问题
我有如下静态书籍数据:
// books.json [ { "id": 1, "name": "Gullivers Travels" }, { "id": 2, "name": "Lowland" } ]
当前的GraphQL类型定义如下:
// typedefs.js import { gql } from "apollo-server"; const typeDefs = gql` # type book is defined type Book { id: String! name: String! fullName: String } type Query { getAllBooks: [Book!]! } `; export { typeDefs };
我希望查询返回的fullName字段是id与name的拼接结果(格式如"1-Gullivers Travels"),示例返回结果如下:
[ { "id": 1, "name": "Gullivers Travels", "fullName": "1-Gullivers Travels" }, { "id": 2, "name": "Lowland", "fullName": "2-Lowland" } ]
请问是否可以通过Resolver实现该需求?我使用的是Node.js搭配apollo-server。
解决方案
完全可以通过Resolver实现这个需求,具体步骤如下:
- 编写Resolver函数
针对Book类型的fullName字段,编写Resolver来拼接id和name,同时实现Query中的getAllBooks读取静态数据:
// resolvers.js import books from './books.json'; const resolvers = { Book: { // parent参数对应每个Book对象的原始数据 fullName: (parent) => `${parent.id}-${parent.name}` }, Query: { getAllBooks: () => books } }; export { resolvers };
- 关联Resolver与TypeDefs到ApolloServer
在服务入口文件中,将typeDefs和resolvers同时传入ApolloServer实例:
// index.js import { ApolloServer } from 'apollo-server'; import { typeDefs } from './typedefs.js'; import { resolvers } from './resolvers.js'; const server = new ApolloServer({ typeDefs, resolvers }); server.listen().then(({ url }) => { console.log(`🚀 Server ready at ${url}`); });
- 验证效果
启动服务后,执行如下GraphQL查询:
query { getAllBooks { id name fullName } }
即可得到包含拼接后fullName字段的预期结果。
内容的提问来源于stack exchange,提问作者Anijit Sau
相关产品推荐
相关产品推荐

