简介
GraphQL 是一种用于 API 的查询语言,它对前端开发人员来说是一个很有用的工具。而 express-graphql-custom-req-limit 则是一个基于 Express 框架的 GraphQL 中间件,可以限制 GraphQL API 每次请求的数据量和请求次数。
本文将会介绍如何使用 express-graphql-custom-req-limit 这个 npm 包,并针对其中的关键技术进行详细解析。
安装
首先,你需要安装 express 和 express-graphql-custom-req-limit 这两个 npm 包:
npm install express express-graphql-custom-req-limit
使用
使用 express-graphql-custom-req-limit 需要先创建一个 GraphQL schema:
const { buildSchema } = require('graphql'); const schema = buildSchema(` type Query { hello: String } `);
接着,创建一个 Express 应用程序,并将 schema 和中间件添加到应用程序中:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ----------- - -------------------------------------------- ----- --- - ---------- ------------------- ------------- ------- ------- ---------- - ------ -- -- ------ ------- -- --------- ----- ----
现在,你已经可以通过访问 http://localhost:3000/graphql
来进行 GraphQL 查询了。
配置
默认情况下,express-graphql-custom-req-limit 使用了如下的默认值:
- 每次请求的数据量上限为 1MB;
- 每 10 秒最多可以处理 10 次请求;
- 当某一时刻请求数超过了上限时,会返回 HTTP 状态码为 429 的错误。
如果需要自定义这些限制,你可以在调用 graphqlHTTP() 函数时传入一个 options 对象:
-- -------------------- ---- ------- ------------------- ------------- ------- ------- ---------- - ------ -- -- ------ ------- -- --------- ----- --------- ---- - ----- -- ----------- --- --------- -- -- - -- ------- - --- ------ -------- ---- -- - -- --------- -------------------- -- ----
可以看到,我们在 options 对象中传入了三个参数:
maxBytes
:每次请求的数据量上限,单位为字节;maxCalls
:每 10 秒最多可以处理的请求次数;error
:用于自定义错误处理函数。
另外,我们也可以使用 onExceededMax
参数来控制当某一时刻请求数超过了上限时的响应行为:
-- -------------------- ---- ------- ------------------- ------------- ------- ------- ---------- - ------ -- -- ------ ------- -- --------- ----- --------- ---- - ----- --------- -- -------------- ----- ---- --------- --------- -- - ------------------------------ --- ----------- -- ----
解析
机器无法识别自然语言,因此客户端向服务端发送的查询请求必须使用一个特定的 JSON 格式,称为 GraphQL 查询语言。这个格式看起来很像 JavaScript 对象,比如:
{ hero { name friends { name } } }
上述查询语言的含义是:获取英雄(hero)的名字(name)和其朋友(friends)的名字(name)。
如何将这些查询语言翻译成实际的数据呢?这就是 GraphQL schema 要实现的内容了。一个 schema 包含了一些 type(类型),而每个 type 又包含了一些字段(field)。比如,我们可以定义一个名为 Query 的 type,它包含了一个名为 hello 的字段:
const { buildSchema } = require('graphql'); const schema = buildSchema(` type Query { hello: String } `);
该 schema 定义了一个字符串(String)类型的字段 hello,用于返回一个字符串。这样,在服务端即可写下如下处理函数:
const root = { hello: () => { return 'Hello world!'; }, };
最后,我们将 schema 和处理函数提供给 express-graphql-custom-req-limit 中间件,并使用 Express 启动服务器:
app.use('/graphql', graphqlHTTP({ schema: schema, rootValue: root, graphiql: true, })); app.listen(4000, () => console.log('Now browse to http://localhost:4000/graphql'));
现在,我们可以通过访问 http://localhost:4000/graphql
来进行 GraphQL 查询,并返回一段字符串 Hello world!
。
示例代码
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ----------- - - ------------------- ----- ----------- - -------------------------------------------- ----- --- - ---------- ----- ------ - ------------- ---- ----- - ------ ------ - --- ----- ---- - - ------ -- -- - ------ ------ -------- -- -- ------------------- ------------- ------- ------- ---------- ----- --------- ----- --------- ---- - ----- --------- -- -------------- ----- ---- --------- --------- -- - ------------------------------ --- ----------- -- ---- ---------------- -- -- ---------------- ------ -- ---------------------------------
总结
本文简要介绍了 npm 包 express-graphql-custom-req-limit 的使用方法,并对其中涉及到的关键技术进行了详细描述。通过本文的学习,读者可以全面掌握 GraphQL 和 express-graphql-custom-req-limit 的使用,并且能更好地理解 GraphQL 中间件的原理。同时,本文也提供了一个完整的示例代码,供读者参考。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60066b5651ab1864dac66b50