Избегайте замены / смешивания пользовательских контекстов в источниках данных сервера apollo во время выполнения асинхронного кода - PullRequest
1 голос
/ 16 марта 2020

Этот вопрос может быть несколько глупым, но я хотел бы убедиться, что не испортил это:

Если вы используете this.context в своем источнике данных, очень важно создать новый экземпляр в dataSources функционировать и не делить ни одного экземпляра. В противном случае инициализация может быть вызвана во время выполнения асинхронного кода для определенного пользователя c, и заменить this.context контекстом другого пользователя.

Источник

Вопрос: Уместно ли следующее, чтобы избежать смешивания / замены пользовательского контекста во время выполнения асинхронного c кода?

main. js

const server = new ApolloServer({
  typeDefs,
  resolvers,
  dataSources: () => {
    return {
      foo: new FooAPI() <- is this considered 'create a new instance in the dataSources function'?
    }
  },
  context: (event) => {
    return {
      use_id: event.user_id <- (provided by auth middleware)
    }
  }
})

MyCustomDatasource. js

class MyCustomDatasource extends DataSource {
  constructor ({ type, tableName, region, apiVersion }) {
    super()
    // db specific stuff
  }

  initialize (config) {
    this.context = config.context <- save due to 'new instance in the dataSources function'?
    this.cache = config.cache

    .
    .
    .
  }

FooAPI. js

class FooAPI extends MyCustomDatasource {
  constructor () {
    super({
      // foo db params
    })
  }

  // Query   
  async allByUser () {
    return await super.query({
      KCE: `
        #user_id = :user_id 
        AND begins_with(#id, :id)
      `,
      EAN: {
        '#user_id': 'user_id',
        '#id': 'id'
      },
      EAV: {
        ':user_id': this.context.user_id, <- save due to 'new instance in the dataSources function'?
        ':id': 'foo'
      },
      Limit: 10
    })
  }

foo resolver

{

  Query: {   
    foos (parent, args, context, info) {
      const { foo } = context.dataSources

      return foo.allByUser()
    }
  },
...