You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS Fetch请求出现TypeError: data is undefined问题求助

问题描述

我想要解析HTTP请求的响应,按需显示错误后返回数据。当前实现代码如下:

fetch(URL,{method:"GET"})
.then(async response => { await read_errors(response) })
// .then(response => { read_errors(response) }) (两种写法都尝试过)
.then( function(data) { 
    doSomething(data)
})
.catch( error => { display_error(error) })

配套函数:

async function read_errors(response) {
    const isJson = response.headers.get('content-type')?.includes('application/json');
    const data = isJson ? await response.json() : null;

    const isText = response.headers.get('content-type')?.includes('text/');
    const text = isText ? await response.text() : null;

    // 检查错误响应
    if (!response.ok) {
        // 从响应体获取错误信息或默认使用响应状态码
        const error = (data && data.message) || text || response.status;
        console.error("Something went wrong : ",error)
        return Promise.reject(error);
    } else {
        fckng_response = isJson ? data : text
        return Promise.resolve(fckng_response)
    }
}

但遇到了TypeError: data is undefined的错误,服务器返回的响应头部和数据均正常,请问哪里操作有误?


问题原因及修复方案

1. 第一个then回调未返回值

你第一个then里的箭头函数没有返回read_errors的执行结果:

.then(async response => { await read_errors(response) })

这里await了异步函数,但没把结果return出去,导致下一个then接收到的data是undefined。改成下面两种写法都可以:

// 写法1:省略大括号自动返回
.then(async response => await read_errors(response))
// 写法2:显式return
.then(async response => { return await read_errors(response) })

2. 响应体被重复读取

response.json()和response.text()都是消费响应体流的方法,同一个响应体只能被读取一次。你现在两个方法都调用了,第二个方法会因为流已经被读完而返回空或报错。

修改read_errors函数,先确定响应类型,只读取一次:

async function read_errors(response) {
    const contentType = response.headers.get('content-type');
    let responseData = null;

    if (contentType?.includes('application/json')) {
        responseData = await response.json();
    } else if (contentType?.includes('text/')) {
        responseData = await response.text();
    }

    // 检查错误响应
    if (!response.ok) {
        const error = (responseData?.message) || responseData || response.status;
        console.error("Something went wrong : ", error);
        return Promise.reject(error);
    } else {
        return responseData;
    }
}

3. 未声明变量导致全局污染

原代码里fckng_response = isJson ? data : text没有用let/const声明,会变成全局变量。不过上面的修复方案已经去掉了这个变量,直接返回responseData更简洁。


内容的提问来源于stack exchange,提问作者Tomy137

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:37:49