Этот вопрос может быть несколько глупым, но я хотел бы убедиться, что не испортил это:
Если вы используете 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()
}
},