xdoer / PreQuest

A Modular And Pluggable Solution For HTTP Request.
https://pre-quest.vercel.app
MIT License
88 stars 14 forks source link

[bug] use-request 返回data错误 #32

Closed bingtsingw closed 3 years ago

bingtsingw commented 3 years ago

有两个小bug

  1. fetchData 函数中, 应该取res.data传给defaultUpdate
  2. defaultUpdate 应该接收两个参数, 默认忽略prevData, 返回新的data
return {
  loading: false,
  data: onUpdate(data!, res.data as any),
  error: null,
}
export function defaultUpdate<Q>(_, data) {
  return data;
}
xdoer commented 3 years ago

感谢,已改正。第一个问题,应当是 res,而不是 res.data,一是因为不确定 prequest 请求实例返回的具体数据结构里有没有 data 这个字段,因为最终拿到的 res ,是经过各种中间件,拦截器处理后的,有可能 res 本身就是 data 了。

bingtsingw commented 3 years ago

确实有这个问题, res不应该直接取data.

不过现在的调用方式不太直觉, 在不使用拦截器的情况下 const { data, error, loading } = useRequest({ path });, 这个data并不是返回body中的请求数据, 而是adaptor的response image

这个API与主流库差别较大, 想到达到"理想"效果, 需要使用中间件

interceptor.response.use((response) => {
  return response.data;
});

不知道能否加一个配置选项, 可以自定义返回res[config], 默认为空或者'data' 如果不加配置的话, 可以在文档上面提一下上面拦截器的使用方式

xdoer commented 3 years ago

我们调用 prequest 实例,应该直接拿到的是 data 数据,这本来就经过了中间件或者拦截器处理过后的。

const user = await prequest('/user', { params: { id: 1 } })

// user.id
// user.name...

一般来讲,我们在根据HTTP 状态码判断异常那里,就可以对 response 做处理。

prequest.use(async (ctx, next) => {
    await next()

    const { statusCode, data } = ctx.response

    if(statusCode !== 200) throw new Error('网络错误')

    ctx.response = data
})