node.js - 返回 null 的 GraphQL 嵌套查询

标签 node.js mongodb mongoose graphql graphql-tools

尝试运行以下查询时出现此错误:“无法为不可为空的字段 User.first_name 返回空值。”。我不希望得到空结果。

Query:
{
  site(site_reference: 123456789) {
    site_name
    site_managers {
      _id
      first_name
    }
  }
}

我希望看到的是:

{
  "data": {
    "site": {
      "site_name": "Test Site",
      "site_managers": [
        {
          "_id": "5bbcd55ff7bd643be4d490fa",
          "first_name": "Claire"
        },
        {
          "_id": "5b9fa2e1f66fb32164f4d547",
          "first_name": "John"
        }
      ]
    }
  }
}

我的 MongoDB 将 _id 存储在它能够返回的数组中,但是我的用户类型中的任何其他内容都返回 null。

用户架构:

type User {
    _id: String!,
    first_name: String!,
    last_name: String!,
    role_id: Int!
    email: String!,
    password: String,
    created_date: String!,
    updated_date: String!,
    last_login_date: String,
    reset_password_token: String
  }
  type Query {
    user(_id: String!): User!
    users(role_id: Int): [User!]!
  }

用户解析器:

  Query: {
    user: (parent, args) => User.findById(args._id),
    users: (parent, args) => {
      if (args.role_id) {
        return User.find({ role_id: args.role_id })
      }
      return User.find({})
    },
  },

网站架构:

  type Site {
    site_name: String!,
    use_policy: String!,
    redirect_url: String!,
    intro_text: String!,
    logo: String!,
    address_line_1: String!,
    address_line_2: String,
    address_city: String!,
    address_county: String!,
    address_postcode: String!,
    phone: String!,
    site_reference: Int!,
    site_managers: [User],
    business_id: String!,
    connect_duration: Int!,
    created_date: String!,
    updated_date: String!,
  }

  type Query {
    site(site_reference: Int!): Site!
    sites(business_id: Int!): [Site!]!
  }

站点解析器:

  Query: {
    site: (parent, args) =>
      Site.findOne({ site_reference: args.site_reference }),
    sites: (parent, args) => Site.find({ business_id: args.business_id }),
  },

我想我需要在我的解析器中为网站查询做更多的事情,但我不确定具体是什么。我已经尝试使用 mongoose.populate 但无济于事,我得到的最远结果是使用 populate 方法返回一个空数组。

提前感谢您的宝贵时间。

编辑: 这是我的 Mongoose 模式

用户模式

const UserSchema = new mongoose.Schema({
  first_name: { type: String, required: true },
  last_name: { type: String, required: true },
  role_id: { type: Number, required: true },
  email: { type: String, required: true },
  password: { type: String },
  created_date: { type: Date, default: Date.now, required: true },
  updated_date: { type: Date, default: Date.now, required: true },
  last_login_date: { type: Date },
  reset_password_token: { type: String },
})

网站架构:

const SiteSchema = new mongoose.Schema({
  site_name: { type: String, required: true },
  use_policy: {
    type: String,
    required: true,
    default: config.defaultUsePolicy,
  },
  redirect_url: {
    type: String,
    required: true,
    default: config.defaultRedirect,
  },
  intro_text: {
    type: String,
    required: true,
    default: config.defaultIntroText,
  },
  logo: { type: String, required: true, default: config.defaultLogo },
  address_line_1: { type: String, required: true },
  address_line_2: String,
  address_city: { type: String, required: true },
  address_county: { type: String, required: true },
  address_postcode: { type: String, required: true },
  phone: { type: String, required: true },
  site_reference: { type: String, required: true },
  site_managers: {type:[mongoose.Schema.Types.ObjectId], required: true}
  business_id: { type: mongoose.Schema.Types.ObjectId, required: true },
  connect_duration: { type: Number, required: true, default: 0 },
  created_date: { type: Date, default: Date.now, required: true },
  updated_date: { type: Date, default: Date.now, required: true },
})

最佳答案

如果您正在使用 MongoDB 和 mongoose,您将需要使用 populate 来加入您的集合。为此,在您的架构中,您要填充的字段不仅需要有一个类型,还需要一个 ref 属性,该属性告诉 mongoose 使用哪个模型来填充该字段,例如:

// Note the actual ref should be whatever name you passed to mongoose.model
site_managers: [{type:mongoose.Schema.Types.ObjectId, ref: 'User'}]

现在,在解析器中使用populate:

site: (parent, { site_reference }) => {
  return Site.findOne({ site_reference }).populate('site_managers').exec()
}

参见 docs获取更详细的示例。

关于node.js - 返回 null 的 GraphQL 嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52780970/

相关文章:

node.js - MongoDB 请求 : Filter only specific field from embedded documents in embedded array

javascript - mongoose findOneAndUpdate 为 err 和 doc 返回 null(使用 Jest)

node.js - Mongoose:使用带有限制的 $in 运算符

node.js - 为什么在谷歌云上启动的ffmpeg函数会抛出 "Error: Output stream error: Maximum call stack size exceeded"?

node.js - Apollo Client V2 获取数据的顺序错误

node.js - Mongoose:在查询条件中的架构字段上应用函数

node.js - 没有 View 引擎的 Node react 结构

java - MongoDB Java 驱动程序 Jackson Mapper MongoJack

java - 使用 java 将超过 16mb 的文档插入 Mongo db 3.0

node.js - 设置选择 : false to subdocuments array at mongoose