为何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
相关产品推荐
相关产品推荐

