Graphql结果不会使用猫鼬填充相关类型中的结果

时间:2019-01-22 07:31:15

标签: mongoose graphql

我试图使用ObjectId引用在Mongoose中创建架构,并能够使用Apollo Server通过GraphQL查询它们

我已经用猫鼬定义了一个非常基本的Book和Author ObjectId引用

const { ObjectId } = mongoose.Schema.Types;
const AuthorSchema = new mongoose.Schema({
  name: String
});

const BookSchema = new mongoose.Schema({
  name: String,
  author: [{ type: ObjectId, ref: 'Author' }]
});

具有这样的graphql模式

  type Author {
    id: ID!
    name: String
  }

  type Book {
    id: ID!
    name: String
    author: Author
  }

  type Query {
    authors: [Author]
    author(id: ID!): Author
    books: [Book]
    book(id: ID!): Book
  }

  input AddAuthorInput {
    name: String!
  }

  input AddBookInput {
    name: String!
    author: ID!
  }

  type Mutation {
    addAuthor(input: AddAuthorInput): Author
    addBook(input: AddBookInput): Book
  }

在解析器中,用于addBook和书籍查询的突变部分是这样的

    addBook: async (_, args) => {
      try {
        const {
          input
        } = args;
        return Book.create(input);
      } catch (e) {
        return e.message
      }
    }

      book: async (_, args) => {
        const { id } = args;
        const result = await Book.findById(id).populate('author').exec();

        console.warn('====== Book query result ======');
        console.log(JSON.stringify(result, null, 2));
        console.warn('====== End Book query result ======');

        return result;

当我对此查询

query book {
  book(id: "xxxxxxx") {
    id
    name
    author {
      name
    }
  }
}

我在 author.name 中为空,同时从控制台输出中可以看到.populate()能够从Authors集合中获取正确的结果。

repo包含我创建的示例代码

1 个答案:

答案 0 :(得分:0)

您的猫鼬模式已设置为每本书返回多位作者:

author: [{ type: ObjectId, ref: 'Author' }]

如果应该只有一位作者,那就去做吧

author: { type: ObjectId, ref: 'Author' }

您不能在GraphQL需要单个对象的情况下返回数组,反之亦然。如果要保持猫鼬模式不变,则需要将author字段返回的类型更改为List的{​​{1}}:

Authors