Node.js调用API无法通过Promise返回数据且请求无限加载如何解决
问题原因和修复方案
- 核心问题:Express 路由处理函数不会自动将函数返回值作为响应返回,你需要主动调用
res.json()或res.send()方法将数据响应给客户端,否则请求会一直处于等待响应的加载状态。 - 代码规范问题:
manga变量未做声明,会变成隐式全局变量,可能引发不可预期的错误。 - 异步写法问题:同时混用
async/await和.then/.catch,代码逻辑混乱,增加异步流程出错的概率。
修正后的控制器代码
const express = require('express') const MFA = require('mangadex-full-api') module.exports = { async indexManga(req, res) { try { // 完成登录验证 await MFA.login('DarksGol', 'R@ul1605', './md_cache/') // 执行漫画搜索 const results = await MFA.Manga.search('Kiss') // 格式化返回结果 const mangalist = results.map(elem => { return { status: elem.status, title: elem.title } }) // 主动返回响应数据 console.log(mangalist) return res.json(mangalist) } catch (err) { // 捕获异常返回错误响应,避免请求挂起 console.error(err) return res.status(500).json({ code: 500, msg: '漫画查询失败', error: err.message }) } } }
改动说明
- 统一用
async/await配合try/catch处理异步逻辑,代码结构更清晰,全流程异常都能被捕获处理。 - 去掉冗余的中间变量,直接用
map方法生成处理后的漫画列表,避免未声明变量的问题。 - 成功查询时主动调用
res.json()将结果返回给客户端结束请求;出现错误时主动返回500错误响应,避免请求无限挂起。 - 现有路由代码无需改动,可直接正常运行。
内容的提问来源于stack exchange,提问作者Raul
相关产品推荐
相关产品推荐

