为啥我的数据被解释为可读流而不是 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 可读流——最简单的方法