mongoose 无法将数据插入到集合具有关系的数据库中

g0czyy6m  于 2023-01-09  发布在  Go
关注(0)|答案(1)|浏览(147)

这是在一个Node项目中,我正在尝试为一个简单的博客编写一个graphql API。
我正在使用apollo,并在幕后试图通过mongoose将数据保存到mongo数据库。
当我尝试保存帖子数据时,我当前收到以下错误。
“图形错误:ID不能表示值:{类型:“缓冲区”,数据:[数组] }“,位于GraphQL标量类型.序列化(/用户/名称/项目/图形时间/节点模块/图形ql/类型/标量.js:301:11)",
它是抱怨作者插入作为职位的一部分,我相信。
我的模式或者我在Apollo GraphiEditor上执行查询的方式有什么问题吗?
是数据库方案

import mongoose from "mongoose";

const authorSchema = new mongoose.Schema({
  name: { type: String, required: true },
  avatar: { type: String },
});

export const Author = mongoose.model('Author', authorSchema);

const postSchema = new mongoose.Schema({
  title: { type: String, required: true },
  authors: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Author'
    }
  ]
});

export const Post = mongoose.model('Post', postSchema);

这是graphql架构

type Post {
    id: ID!
    title: String
    authors: [Author]
}

type Author {
    id: ID!
    name: String
    avatar: String
}

type Mutation {
    addPost(
        title: String!,
        authors: [ID!],
    ): Post
}

这是grapql解析器。

const resolvers = {
  Mutation: {
    addPost: (_, args, context) => {
      const newPost = new Post({
        title: args.title,
        authors: args.authors,
      });
      return newPost.save();
    },
  },
};

这就是我在抛出错误的编辑器中查询的方式。
注:DB中已经有一个作者,假设该行的ID为:63babc44e18d174016b03433

mutation {
  addPost(
    title: "New Post",
    authors: ["63babc44e18d174016b03433"],
  ) {
    title
    authors {
      id
      name
    }
  }
}
j1dl9f46

j1dl9f461#

你是这样定义突变的:

type Mutation {
    addPost(
        title: String!,
        authors: [ID!],
    ): Post
}

这意味着addPost返回一个Post对象,即:

type Post {
    id: ID!
    title: String
    authors: [Author]
}

因此authorsAuthor对象的数组,而不是_id对象的数组。
您正在获取ID并保存到DB中,但返回的对象与[Author]不匹配。还要注意postSchema是如何成为mongoose.Schema.Types.ObjectId的。引用到Authors,是的,但它是一个ID数组。
因此,您可以返回ID数组而不是Author对象,或者在mongoose中填充查询,因为您有引用。

相关问题