当我使用 Mock Service Worker 测试两个 get 请求时,为啥 req.url.searchParams 参数对象为空?

Posted

技术标签:

【中文标题】当我使用 Mock Service Worker 测试两个 get 请求时,为啥 req.url.searchParams 参数对象为空?【英文标题】:Why the req.url.searchParams parameters object is empty when I test two get requests using Mock Service Worker?当我使用 Mock Service Worker 测试两个 get 请求时,为什么 req.url.searchParams 参数对象为空? 【发布时间】:2021-11-07 01:24:12 【问题描述】:

我在一个使用 Mock Service Worker 的反应应用程序中进行了测试。我这样设置服务器:

 const server = setupServer(

  // https://api.github.com/search/users?q=$userName&type=users&per_page=10&page=$pageNo`,
  rest.get('https://api.github.com/search/users/', async (req, res, ctx) => 
    console.log('rest req.params', req.params) //  empty object
    console.log('rest req.url.searchParams', req.url.searchParams) //  empty object
    const users = search_data[1]
    return res(ctx.json(users))
  ),

  // https://api.github.com/users/$user
  rest.get(`https://api.github.com/users/:user`, async (req, res, ctx) => 
    // console.log('rest req.params.user', req.params.user) // this works as it should
    return res(
      ctx.json(
        users_data[1].users.find((user) => user.login === req.params.user)
      )
    )
  )
)

上面的第一个get请求正在拦截被注释掉的api端点(它上面的那个)。 我想在一个对象中获取查询参数,比如用户名,但返回的对象是空的。我做错了什么?

截取的代码如下:

const searchGithubApi = (
  userName: string,
  pageNo: number = 1,
  signal: AbortSignal
) => 
  console.log('userName', userName) // I get the correct userName
  return fetch(
    `https://api.github.com/search/users?q=$userName&type=users&per_page=10&page=$pageNo`,
    
      headers: 
        Accept: 'application/vnd.github.v3+json',
      ,
      signal,
    
  ).then((res) => res.json())
  

【问题讨论】:

【参考方案1】:

请参阅下面的链接,它解释得很好。 https://github.com/mswjs/msw/discussions/910

【讨论】:

【参考方案2】:

您应该使用URLSearchParams API 来检索请求查询参数:

req.url.searchParams.get('q')

注销req.url.searchParams 将始终返回一个空对象,因为您实际上是在注销一个不将查询参数存储为其属性的类实例(因此您会看到一个空对象)。

【讨论】:

以上是关于当我使用 Mock Service Worker 测试两个 get 请求时,为啥 req.url.searchParams 参数对象为空?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mock Service Worker 时如何对 graphql 查询变量进行断言?

使用 mock service worker 测试 React App 时如何记录请求数?

Jest 使用 Mock Service Worker (MSW) 或其他模拟离线网络?

React&Service Worker - 缓存内容 - 通知用户

重新加载页面后,Service Worker 显示为已删除

Service Worker 正在缓存文件,但从未触发 fetch 事件