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

为何res.json()在async/await中正常,在Promise.then()中返回undefined?

问题原因与解决方案

核心问题在于你使用.then()链式调用时,第一个回调函数没有返回res.json()生成的Promise,导致后续.then()接收到的参数是undefined。

错误代码的问题点

res.json()方法本身会返回一个Promise,它会把响应体解析为JSON对象。在你的第一个.then()回调中,你只调用了res.json()但没有将其返回,此时回调函数默认返回undefined,所以下一个.then()的obj参数自然就是undefined。

修正后的.then()代码

只需要在第一个.then()中返回res.json()的结果即可:

const requestURL = "/auth/profile";

const request = new Request(requestURL, {
    method: 'POST'
});
fetch(request)
    .then( (res) => {
        // 关键:返回res.json()生成的Promise
        return res.json()
    })
    .then(obj => {
        console.log(obj) // 现在会输出正确的JSON对象
    })
    .catch(err => {
        console.log(err)
    })

也可以简化为箭头函数的隐式返回:

fetch(request)
    .then(res => res.json()) // 隐式返回res.json()的Promise
    .then(obj => console.log(obj))
    .catch(err => console.log(err))

为什么async/await的写法能正常工作

在你使用async修饰的.then()回调中,await res.json()会等待Promise解析并拿到JSON对象,虽然你没有主动返回这个对象,但你直接在回调内部执行了console.log(obj),所以能看到正确结果。如果要在后续链式调用中使用这个对象,同样需要return obj。

关于服务端代码的补充

你的服务端代码没有问题,res.status(200).send(result)已经正确返回了JSON格式的响应,并且设置了正确的content-type头,这部分无需修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:36:14