使用 apollo-express 限制或过滤 graphql 查询

Posted

技术标签:

【中文标题】使用 apollo-express 限制或过滤 graphql 查询【英文标题】:Limiting or filtering a graphql query using apollo-express 【发布时间】:2020-09-11 12:41:31 【问题描述】:

我是 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, 

    )

我的 typeDefs:

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"
      
    ]
  

【问题讨论】:

使用 mongo 限制 - 检查文档,传递参数 【参考方案1】:

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

就是这样?。

【讨论】:

非常感谢!我已经偶然发现了这一点。我不明白为什么人们对我的问题或您的回答投了反对票,因为它是正确的。 graphql 中的新手如何按照一些 youtube 教程让它运行假设知道 .find() 是一种特定的猫鼬语法?只需要知道解析器使用猫鼬语言。还是谢谢你!

以上是关于使用 apollo-express 限制或过滤 graphql 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用过滤器来限制 JSP 访问?

[ jquery 过滤器 slice(start, [end]) ] 此方法用于在选择器的基础之上精确筛选出匹配的子集(可以使用前导限制范围)

绕过PHP代码执行中的过滤限制详解

使用 JFileChooser 过滤文件类型

海量数据与布隆过滤

使用ACL限制FTP访问权限示例