У меня есть приложение node, которое использует библиотеку для выполнения запроса graphql после его аутентификации. Следующий запрос graphql не принимает запрос:
graphql.query(/^(.+?)$/, (req, res, ctx) => {
console.info('keys:', Object.keys(req))
console.info('query:', req.query)
console.info('variables', req.variables)
return res(
ctx.data({
data: [],
})
)
}),
Пробовал много комбинаций, но /^(.+?)$/ должен подобрать что-нибудь. При добавлении следующего:
rest.post('*', (req, res, ctx) => {
console.info('POST ALL', req.url.pathname)
if (req.url.pathname === '/oauth/token') {
return res(
ctx.status(200),
ctx.json({
valid:'token'
})
)
}
return req.json().then((body) => {
console.info('body:', body)
console.info('pass through')
return req.passthrough()
})
}),
Он регистрирует следующее:
POST ALL /oauth/token
POST ALL /project/graphql
body: {
operationName: 'ProductTypeId',
query: '\n' +
' query fetchProductTypeId($where: String) {\n' +
' productTypes(where: $where, limit: 1) {\n' +
' results {\n' +
' id\n' +
' }\n' +
' }\n' +
' }\n' +
' ',
variables: { where: 'key = "typeKey"' }
}
pass through
Но при попытке обработчиков:
graphql.query(/^(.+?)$/, (req, res, ctx) => {
console.info('keys:', Object.keys(req))
console.info('query:', req.query)
console.info('variables', req.variables)
return res(
ctx.data({
data: [],
})
)
}),
rest.post('*/oauth/token', (req, res, ctx) => {
log('POST', req.url.pathname)
if (req.url.pathname === '/oauth/token') {
return res(
ctx.status(200),
ctx.json({
valid:'token'
})
)
}
log('pass through')
return req.passthrough()
}),
Используется обработчик запроса токена, но затем библиотека делает запрос graphql, а обработчик graphql никогда не используется, и вместо этого я получаю:
[MSW] Warning: captured a request without a matching request handler:
• POST https://server/project/graphql
If you still wish to intercept this unhandled request, please create a request handler for it.
Read more: https://mswjs.io/docs/getting-started/mocks
Мило со стороны msw сказать мне, но обработчик явно там. Пробовал graphql.query('ProductTypeId' и graphql.query('fetchProductTypeId' но результат тот же. Похоже, что обработчик rest.post и graphql.query ломает graphql, даже если сообщение получает только аутентификацию.
Обновить
Удалены все обработчики, кроме graphql, и предоставлены действительные учетные данные для создания токена. Итак, единственный обработчик, который у меня есть:
graphql.query('fetchProductTypeId', (req, res, ctx) => {
console.info('keys:', Object.keys(req))
console.info('query:', req.query)
console.info('variables', req.variables)
return res(
ctx.data({
data: [],
})
)
}),
Затем на стартовом сервере у меня есть:
server.listen({
onUnhandledRequest: (req) => {
console.info('unhandled')
console.info('path:::', req.url.pathname)
req
.json()
.then((body) => {
console.info('body:::', body)
})
.catch((e) => e)
},
})
Это будет регистрировать:
unhandled
path::: /project/graphql
body::: {
query: 'query fetchProductTypeId($where: String) {\n' +
' productTypes(where: $where, limit: 1) {\n' +
' results {\n' +
' id\n' +
' }\n' +
' }\n' +
' }\n' +
' ',
operationName: 'fetchProductTypeId',
variables: { where: 'key = "key"' }
}
Возможно, graphql просто полностью сломан в версии msw, которую я установил (версия 0.47.4)
И graphql.query(/^(.+?)$/ делает то же самое, этого обработчика может и не быть вовсе.
** Обновлять
Я вижу, что graphql.operation((req, res, ctx) как обработчик также не вызывается, поэтому msw просто не должен понимать, что мой запрос graphql не является запросом graphql, хотя тело регистрируется и, очевидно, является запросом graphql.
Только что создал выпуск
Я вижу, что библиотека, которую я использую, создала заголовок 'Content-Type': 'application/graphql',, судя по быстрому чтению здесь, все в порядке, но когда я изменю его на 'Content-Type': 'application/json' (библиотека позволяет мне добавлять заголовки), он будет выбран обработчиком.