问题描述: 在使用Apollo GraphQL查询MongoDB时,如果子文档为空,返回的数据为null。
解决方法: 在Apollo Server的Resolver中,可以通过添加一个自定义的转换函数来解决这个问题。该函数将在将查询结果发送给客户端之前调用,并可以对结果进行修改。
以下是一个示例解决方法的代码示例:
// 导入所需的库和模块
const { ApolloServer, gql } = require('apollo-server');
const { MongoClient, ObjectID } = require('mongodb');
// 连接到MongoDB数据库
const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
client.connect();
// 定义GraphQL Schema
const typeDefs = gql`
type User {
id: ID!
name: String!
address: Address
}
type Address {
street: String
city: String
state: String
}
type Query {
user(id: ID!): User
}
`;
// 定义GraphQL Resolver
const resolvers = {
Query: {
user: async (_, { id }) => {
// 查询数据库获取用户数据
const db = client.db('test');
const collection = db.collection('users');
const user = await collection.findOne({ _id: ObjectID(id) });
// 在返回结果之前,检查子文档是否为空,如果为空,返回一个空的Address对象
if (!user.address) {
user.address = { street: null, city: null, state: null };
}
return user;
},
},
};
// 创建Apollo Server实例
const server = new ApolloServer({ typeDefs, resolvers });
// 启动服务器
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
在上述代码示例中,我们定义了一个User类型,其中包含一个子类型Address。在Resolver的user方法中,我们首先查询数据库获取用户数据。然后,我们检查地址是否为空,如果为空,我们手动创建一个空的Address对象并将其赋值给用户的address字段。
这样,当Apollo GraphQL查询返回时,如果子文档为空,将返回一个包含null值的空Address对象,而不是返回null。
请注意,这只是一个示例解决方法,具体的实现可能因项目的结构和需求而有所不同。