如何将参数传递给graphqlHTTP中间件

如何将参数传递给graphqlHTTP中间件

我正试图将授权标头令牌有效负载从另一个上层中间件传递给graphqlHTTP中间件

app.use('/private',(req:Request,res:Response,next:Function) => {

   if(!req.header('Authorization')){
      res.json({
         error:true,message:'Authorization bearer required'
      })
   }else{
      const token = Buffer.from(req.header('Authorization').split('Bearer ')[1],'base64').toString('ascii');
      if(decode(token)){
         next();
      }else{
         res.json({
            error:true,message:'Authorization bearer required'
         })
      }
   }
});

app.use('/private',graphqlHTTP({
   schema:privateSchema,graphiql:false
}))
bsyang1225 回答:如何将参数传递给graphqlHTTP中间件

通常在请求本身中从中间件设置数据。

在您的方案中,可以将令牌设置为req.token,然后将其传递到您的graphql解析器上下文,例如:

// main.js

app.use(authMidddleware) // sets req.token
app.use(
  '/graphql',bodyParser.json(),graphqlExpress(req => ({ schema,context: req }))
)

// some-resolver.js
export const myResolver = {
  Query: {
    token: async (parent,{ input },context) => {
      const { token } = context;
      // other stuff
    }
  }
}
,

最近尝试了这个并且它有效:

jwtAuth - 检查令牌的授权标头的中间件。 对其进行解码并将凭据存储在 req.auth 中。

文件映射

...
[graphql]
[utils]
index.js

index.js

...

const graphqlSettings = require("./graphql/settings");
const jwtAuth = require("./utils/jwtAuth");
// init
...
// parser
...
// cors setup
...        
// JWT authentication
app.use(jwtAuth);    
// graphql init
app.use("/graphql",graphqlSettings);
...

settings.js

...
const { graphqlHTTP } = require("express-graphql");
const typeDefs = require("./typeDefs");
const resolvers = require("./resolvers");
// models
...
// extend context with models
const models = {
    ...
};

module.exports = graphqlHTTP((req) => ({
    graphiql: true,schema: typeDefs,rootValue: resolvers,context: {
        ...models,auth: req.auth,},}));
本文链接:https://www.f2er.com/3168319.html

大家都在问