将任何 Express 中间件与 graphql-http
结合使用非常简单。特别是,这对于处理身份验证来说是一个很好的模式。
要在 GraphQL 解析器中使用中间件,只需像在普通 Express 应用程序中一样使用中间件即可。然后,request
对象作为任何解析器的第二个参数可用。
例如,假设我们希望我们的服务器记录每个请求的 IP 地址,并且我们还想编写一个返回调用者 IP 地址的 API。我们可以使用中间件来完成前者,并通过访问解析器中的 request
对象来完成后者。以下是实现此目的的服务器代码
var express = require("express")var { createHandler } = require("graphql-http/lib/use/express")var { buildSchema } = require("graphql")
var schema = buildSchema(` type Query { ip: String }`)
const loggingMiddleware = (req, res, next) => { console.log("ip:", req.ip) next()}
var root = { ip: function (args, request) { return request.ip },}
var app = express()app.use(loggingMiddleware)app.all( "/graphql", createHandler({ schema: schema, rootValue: root, graphiql: true, }))app.listen(4000)console.log("Running a GraphQL API server at localhost:4000/graphql")
在 REST API 中,身份验证通常通过包含身份验证令牌的标头来处理,该令牌证明是哪个用户发出了此请求。Express 中间件处理这些标头并将身份验证数据放在 Express request
对象上。一些处理此类身份验证的中间件模块是 Passport、express-jwt 和 express-session。这些模块中的每一个都与 graphql-http
协同工作。
如果您不熟悉任何这些身份验证机制,我们建议使用 express-jwt
,因为它很简单,但不会牺牲任何未来的灵活性。
如果您已经线性地阅读了文档并到达了这一点,恭喜您!您现在已经了解了构建实用 GraphQL API 服务器所需的一切。