在上下文(在express.js中请求)对象中附加属性

时间:2019-10-10 05:49:25

标签: node.js express graphql prisma express-graphql

我是 GraphQL 的新手,我现在正尝试使用express-graphql制作API服务器。

我想做的是在context对象中为解析器添加新属性,这可以在初始化express-graphql服务器实例时完成。

根据官方文档,默认情况下表示,如果代码中未指定任何内容,则每个解析器函数中的context对象将具有一个在中先前称为req的对象 Express.js

app.use(
  '/graphql',
  graphqlHTTP({
    schema: schema,
    graphiql: true
  })
)
// by this,
// in resolver there will be `context` available
// which includes the data previously available in `req` object (express.js case)

然后,如果我想将自己的自定义属性添加到req的所有成员中的contextreq对象中,该怎么办?我只想添加一个或两个新值,而不想丢失req已经拥有的其他值。

app.use(
  '/graphql',
  graphqlHTTP({
    schema: schema,
    graphiql: true,
    context: {
      customData: 'Yay!'
    }
  })
)
// I was able to add my own data in `context`,
// but eventually I lost all of data which was previously in the `req` object! ?

任何好主意或知识将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以这样使用

app.use('/graphql', expressGraphql(req => ({
  schema,
  graphiql: false,
  context: {
    ...req,
    customData: 'Yay!'
  }
})))

请参阅文档https://github.com/graphql/express-graphql#providing-extensions

答案 1 :(得分:1)

您可以编写要添加的中间件,并在配置graphqlHTTP之前使用它。

const setMyContext = (myContext = {}) => {
    return function (req, res, next) {
        req.myContext = myContext;
        next()
    }
};

app.use(setMyContext({
    customData: 'Yay!'
}));

app.use(
  '/graphql',
  graphqlHTTP({
    schema: schema,
    graphiql: true
  })
)

U可以通过以下方式访问customData

req.myContext.customData