为啥我的数据被解释为可读流而不是 json 对象?

Posted

技术标签:

【中文标题】为啥我的数据被解释为可读流而不是 json 对象?【英文标题】:Why is my data being interpreted as a readable stream instead of a json object?为什么我的数据被解释为可读流而不是 json 对象? 【发布时间】:2022-01-21 20:14:00 【问题描述】:

我正在 Kotlin 中构建一个简单的 REST API,并使用 React 构建前端。我对 Kotlin 和 Spring 还很陌生,但我设法获得了与 Postman 一起使用的简单服务。我能够使用 JpaRepository 接口返回 SQL 表中的所有对象。当我通过 Postman 拨打电话时,我的输出符合预期(看起来像一个普通的 Json 对象)。

但是,当我通过标准 react fetch 进行调用时,主体会生成为 ReadableStream locked: false。我对可读流进行了一些研究,它们似乎主要用于图像。我尝试了 https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Using_readable_streams 的 body.getReader(),但也没有用。

这是我的 Kotlin 代码:

import org.springframework.web.bind.annotation.*


@RestController
@RequestMapping("/api/catalog")
class ArtworkController (
    private val artworkService: ArtworkService
        ) 


    @CrossOrigin
    @GetMapping("")
    @ResponseBody
    fun getData(): MutableList<Artwork> 
//        println(artworkService.getArt().javaClass.kotlin)
        return artworkService.getArt()
    




@Service
class ArtworkService(
    private val artworkRepository: ArtworkRepository
)

    fun getArt(): MutableList<Artwork> 
        return artworkRepository.findAll()
    

这些文件位于单独的文件中 - 为简洁起见,将它们加入此处。 任何帮助将不胜感激!

【问题讨论】:

您可以删除 ResponseBody 注释,因为 RestController 包含:docs.spring.io/spring-framework/docs/current/javadoc-api/org/… 您的反应是等待什么媒体类型?这将发送“application/json”而不是任何流。 【参考方案1】:

事实证明,我立即返回了一个 Promise,并且不得不设置一个异步函数来处理该请求。

  const  isLoading, error, data  = useQuery("repoData", 
  async () => 
    const data = await fetch("https://url_here")
    .then(function(response) 
      return response.json()
    
  
  )  
  setData(data)
  

对于上下文,此请求包含在 react-query 中,但没有它也可以工作。

【讨论】:

以上是关于为啥我的数据被解释为可读流而不是 json 对象?的主要内容,如果未能解决你的问题,请参考以下文章

从 JavaScript 对象创建 Node.js 可读流——最简单的方法

Power Automate Flow:将 json 转换为可读的 PowerAutomate-Items

我可以获取可读流然后转换为 JSON 客户端吗?

将 ison 转换为可读的飞镖

为啥我们需要返回一个流而不是直接分派一个值?

在NodeJS中将可读流关闭到FIFO