当我使用 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 参数对象为空?的主要内容,如果未能解决你的问题,请参考以下文章