首页 > 解决方案 > 使用 apollo-express 限制或过滤 graphql 查询

问题描述

我是graphql的新手。我正在后端使用 graphql 构建一个反应站点。我试图弄清楚如何限制解析器返回的对象(或项目)的数量。文档非常稀缺,我没有看到过滤、限制或排序的明确示例。

我的索引文件如下所示:

import express from "express";
import mongoose from "mongoose";
import {ApolloServer, gql} from "apollo-server-express";
import {resolvers} from "./resolver"
import {typeDefs} from "./typeDefs"
const bodyParser = require('body-parser');

const server = async () => {

    const app = express();

    app.use(bodyParser.json());

    app.use((req, res, next) => {
        res.setHeader('Access-Control-Allow-Origin', '*');
        res.setHeader('Access-Control-Allow-Methods', 'POST,GET,OPTIONS');
        res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
        if (req.method === 'OPTIONS') {
          return res.sendStatus(200);
        }
        next();
      });


    const server = new ApolloServer({
        typeDefs,
        resolvers
    })

    server.applyMiddleware({app})

    await mongoose.connect("mongoaddr...",{useNewUrlParser:true})

    app.get('/', (req,res)=> res.send('hello'))
    app.listen({port:4001}, ()=>{
        console.log('connected')
    })

}

server()

我的模型:

import mongoose from "mongoose";
export const Post = mongoose.model("Post",{
    word:String, 

    )

我的类型定义:

import {gql} from "apollo-server-express";
export const typeDefs = gql`

type Query{

    getPosts(limit:Int):[Post!]!

}
type Post {
    id:ID!
    word: String!

}

还有我的解析器:

import { Post } from "./models/Post";


export const resolvers = {
    Query:{

        async getPosts(_,{ limit },context){
            const post = Post.find()
            console.log(limit)
            return(post)

        }}

}
Mutation:{...}

我根本不明白如何限制 getPosts 查询。使用 Posts.find() 我可以获取网站中的所有项目,但是当我使用 console.log 时,它会为我提供大量元数据。

任何人都可以举一个例子,说明如何根据我的情况过滤前 10 个对象。我正在过滤的数据在 mongo db 中。所以基本上是一个标准的json,比如:

{
  "data": {
    "getPosts": [
      {
        "word": "test"
      },
      {
        "word": "test1"
      }
    ]
  }
}

标签: javascriptreactjsgraphqlgraphql-jsexpress-graphql

解决方案


一点关系grapql都没有!您必须对从 mongoose 模型中获取的文档数组进行切片。在您的情况下,该函数将返回一个文档getPosts数组。Post所以,你只需要切片并返回数组。

async getPosts(_,{ limit },context){
  const post = Post.find()
  return post.slice(0, limit)
}}

或者更好的是,您可以使用mongoose限制:

async getPosts(_,{ limit },context){
  const post = Post.find().limit(limit)
  return post
}}

而已 。


推荐阅读