Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 添加响应类型包装器 #190

Merged
merged 1 commit into from
Feb 4, 2024

Conversation

WangMingHua111
Copy link
Contributor

@WangMingHua111 WangMingHua111 commented Jan 22, 2024

支持响应类型包装,解决 后端文档与接口返回不一致问题

@Manweill
Copy link
Owner

@WangMingHua111 有没有响应的示例,是解决了什么问题,目前看出是做了什么修改

@WangMingHua111
Copy link
Contributor Author

image

修改真实的响应类型为一个格式化type

@WangMingHua111
Copy link
Contributor Author

@Manweill

@WangMingHua111
Copy link
Contributor Author

WangMingHua111 commented Jan 22, 2024

image

产生的原因是网关层格式化了返回的数据,导致与真实类型不匹配(真实数据与swagger返回类型不匹配)

@Manweill
Copy link
Owner

Manweill commented Jan 23, 2024

这种的话,我这边建议时候在 axios(或者其他的 request 请求客户端)的响应流过滤器里面直接处理就可以了。

即,axos 的话 是在axiosInstance.interceptors.response.use中处理,例如网关层多包了一层给,那就在这里面做好返回数据的组装就好了,再把真实的数据返回.

例如你这里的话,那就是 return {data:reponse.data.data}

你看下能不能足你需求

@Manweill
Copy link
Owner

贴一个我对接的一个工程的例子

axiosInstance.interceptors.response.use(
  (response) => {
    const config: any = response.config
    const data: ResponseBodyType = response.data
    if (config) {
      hideLoading()
    }

    if (data.success && data.code === 200) {
      return response
    } else if (response.data.code === 0) {
      return response.data
    } else {
      const code = data.code
      let errorMessage = ''

@WangMingHua111
Copy link
Contributor Author

WangMingHua111 commented Jan 23, 2024

有道理,我这边在响应拦截器中, 添加格式化代码,提取网关格式化后的data。

我这边依然建议支持包装返回的类型,因为目前我有一个需求,将所有的可选参数包装为必填参数。或者有更优雅的方式实现

示例:
image

@WangMingHua111
Copy link
Contributor Author

这种的话,我这边建议时候在 axios(或者其他的 request 请求客户端)的响应流过滤器里面直接处理就可以了。

即,axos 的话 是在axiosInstance.interceptors.response.use中处理,例如网关层多包了一层给,那就在这里面做好返回数据的组装就好了,再把真实的数据返回.

例如你这里的话,那就是 return {data:reponse.data.data}

你看下能不能足你需求

能满足要求,似乎是应该这样处理

@WangMingHua111
Copy link
Contributor Author

如果你这边不建议包装返回类型 我这边把这个提交关闭掉

@Manweill
Copy link
Owner

有道理,我这边在响应拦截器中, 添加格式化代码,提取网关格式化后的data。

我这边依然建议支持包装返回的类型,因为目前我有一个需求,将所有的可选参数包装为必填参数。或者有更优雅的方式实现

示例: image

应该是理解错误了,这个应该是 strictNullChecks这个控制,会严格准守 swagger 的定义。并且你在这里如果进行了包装,会不够灵活,这个写法留给开发自己控制就可以,个人感觉。所以这个用户有点不合理。你可以先看看strictNullChecks这个属性是否满足。

@Manweill
Copy link
Owner

即在返回值里面自行 as Required<T> 到指定类型。

@WangMingHua111
Copy link
Contributor Author

这仅能算一个一个业务需求,strictNullChecks 会导致整个项目中的代码不进行检查。在这里我希望是进行 api data 进行 bind 的时候不检查。
另外严格准守 swagger 的定义是有必要的,但由于项目组成员对ts不熟悉,导致了项目在构建过程中常出现大量的 type check 错误。所有做了一下业务向兼容。而在这种情况下 as Required 会对他们代码额外的负担。

@WangMingHua111
Copy link
Contributor Author

通过 responseTypeWrapper 参数我可以给项目打补丁,不然目前没有任何办法转换 返回的类型。

@Manweill
Copy link
Owner

最近有点忘,忘记看了~我再重新评估一下

@Manweill
Copy link
Owner

Manweill commented Feb 4, 2024

@WangMingHua111 这个pr还有合并的需求吗,如果有我这边重新打开一下

@WangMingHua111 WangMingHua111 reopened this Feb 4, 2024
@WangMingHua111
Copy link
Contributor Author

重新打开了

@WangMingHua111
Copy link
Contributor Author

@Manweill

@Manweill Manweill merged commit cab5017 into Manweill:main Feb 4, 2024
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants