使用 Mongoose 和 graphql-yoga 实现分页

Posted

技术标签:

【中文标题】使用 Mongoose 和 graphql-yoga 实现分页【英文标题】:Implementing pagination with Mongoose and graphql-yoga 【发布时间】:2018-10-18 08:15:40 【问题描述】:

我正在尝试使用 graphql,并使用 graphql-yoga 创建了一个简单的服务器。我的 Mongoose 产品模型查询我的数据库,两个解析器都按预期返回数据。到目前为止,一切正常,我很高兴这很容易。但是,我有一个问题。我正在尝试添加一种方法来对来自 graphQL 的结果进行分页。

我尝试了什么?

1) 向查询类型添加限制参数。

2) 在resolver中通过args访问参数

预期行为

我可以在解析器中使用 args.limit 参数并使用它来更改 Mongoose 函数

实际行为

我无法读取 arg 对象。

下面的完整代码。我如何达到这个目标?

import  GraphQLServer  from 'graphql-yoga'
import mongoose from "mongoose"
import products from "./models/products.js"

const connection = mongoose.connect('mongodb://myDB')

const prepare = (o) => 
  o._id = o._id.toString()
  return o


const typeDefs = `
  type Product 
    _id: String
    name: String
    description: String
    main_image: String
    images: [String]
  

  type Query 
    product(_id: String): Product
    products(limit: Int): [Product]
  
`

const resolvers = 
  Query: 
    product: async (_id) => 
      return (await products.findOne(_id))
    ,
    products: async (args) => 
      console.log(args.name)
      return (await products.find().limit(args.limit))
    ,
  ,


const server = new GraphQLServer( 
  typeDefs, 
  resolvers 
)

server.start(() => console.log('Server is running on localhost:4000'))

【问题讨论】:

【参考方案1】:

字段的参数是传递给解析器的第二个参数;第一个参数是父字段解析为的值(或者在查询/突变的情况下为root 值)。所以你的解析器应该看起来更像这样:

product: (root,  _id ) => 
  return products.findOne(_id)

【讨论】:

经过测试并立即生效。感谢您帮助 graphql 初学者:) @daniel 我也在用 graphql-yoga 和 mongoose 测试东西,我有成功的 crud 操作,但我们知道它在删除操作时不会自动更新缓存,它通过查询在后端成功执行并返回已删除的对象id,但是当使用前端接口完成时,它返回 null 你知道为什么会这样吗?这将非常节省时间,您可以提示我在哪里更新我的东西谢谢 @daniel-rearden @HánzláHábib 我不确定这与原始帖子或此答案有何关系。您应该将此作为一个单独的问题发布,提供尽可能多的信息,包括相关代码。

以上是关于使用 Mongoose 和 graphql-yoga 实现分页的主要内容,如果未能解决你的问题,请参考以下文章

如何使用用户名和密码连接 mongodb(mongoose)?

Egg中使用egg-mongoose和常用的Mongoose 方法

Egg中使用egg-mongoose和常用的Mongoose 方法

Egg中使用egg-mongoose和常用的Mongoose 方法

如何在不创建 Mongoose 模型的情况下将 GraphQL 与 Mongoose 和 MongoDB 一起使用

Mongoose 和 Postman:使用嵌套对象测试模型