Имитация сервисного работника на узле post и grapql.query не работает

У меня есть приложение 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.

Только что создал выпуск

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
0
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я вижу, что библиотека, которую я использую, создала заголовок 'Content-Type': 'application/graphql',, судя по быстрому чтению здесь, все в порядке, но когда я изменю его на 'Content-Type': 'application/json' (библиотека позволяет мне добавлять заголовки), он будет выбран обработчиком.

Другие вопросы по теме