Node-Fetch API中text()方法作用解析及Promise相关问题
text()方法的作用详解 嘿,我来给你把text()的作用说透,还有为啥你的代码里必须用上它~
首先得搞懂fetch调用后到底返回啥:当你调用fetch()的时候,它会返回一个Promise,最终解析为Response对象。这个Response可不是你要的接口返回数据,它更像一个"包裹"——里面装着响应的状态码、请求头这些元数据,还有一个待读取的可读流(也就是真正的响应内容)。你没法直接从Response里掏出数据,必须用它提供的方法来读取这个流,text()就是干这个的。
那text()具体做了啥?它是Response对象的内置方法,会帮你把响应体的可读流全部读取出来,转换成一个普通字符串,而且这个操作是异步的,所以它返回的还是一个Promise——这也是为啥你得用.then()或者await来获取它的结果。
回到你的代码例子:
async getRandomNumber() { return await fetch(`${this.url}random`) .then((result) => result.text()) .then((body) => { const data = JSON.parse(body); console.log(data); }) }
这里的result就是解析后的Response对象,调用result.text()后,才把响应流转换成了字符串格式的body,之后你才能用JSON.parse把它转成可操作的JSON对象。如果跳过text(),你拿到的就是那个Response对象本身,自然看不到接口返回的数据,只会看到一个已解析的Promise(其实是Response实例)。
顺便提一句,像你这种接口返回JSON的场景,其实可以用更省事的json()方法——它会直接把响应体读取并解析成JSON对象,不用你手动调用JSON.parse,比如:
async getRandomNumber() { return await fetch(`${this.url}random`) .then((result) => result.json()) .then((data) => { console.log(data); }) }
而text()的优势在于处理非JSON格式的响应,比如纯文本、HTML片段、XML内容这些,直接用它就能拿到完整的字符串内容。
内容的提问来源于stack exchange,提问作者Darmon

