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

Posted

技术标签:

【中文标题】在上下文中附加一个属性(express.js 中的请求)对象【英文标题】:Attach a property in context(request in express.js) object 【发布时间】:2020-02-07 12:04:08 【问题描述】:

我是 GraphQL 的新手,我现在正在尝试使用 express-graphql 创建一个 API 服务器。

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

根据官方文档,默认情况下,如果代码中没有指定任何内容,则每个解析器函数中的context对象都会有一个之前在Express中称为req的对象.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)

那么,如果我想在reqcontext 对象中添加我自己的自定义属性,以及所有req 的成员,该怎么办?我只想添加一两个新值,而不是丢失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! ????

非常感谢任何好的想法或知识。

【问题讨论】:

【参考方案1】:

你可以这样使用

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

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

【讨论】:

这似乎是一种简单而真实的方式。谢谢。【参考方案2】:

你可以写一个中间件来添加,在配置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
  )
)

你可以通过

访问customData

req.myContext.customData

【讨论】:

这是一种间接添加数据的方式。这也应该有效。谢谢。

以上是关于在上下文中附加一个属性(express.js 中的请求)对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Mongoose 模型中访问 Express.js 请求上下文

具有未在模型中定义的附加属性的 NSManagedObject 子类

WPF 依赖属性和附加属性

向 Kendo UI 上下文菜单项添加附加数据

使用reduce将结构的属性附加到数组

express.js 中的全局函数?