Next.js中await reverso-api的Promise无法正常结束执行怎么办
问题根因
reverso-api的getContext方法同时兼容回调、Promise两种调用范式,当你传入第四个回调参数时,方法返回的Promise永远不会触发resolve或reject,此时外层await会一直处于挂起状态,代码自然不会继续向下执行。你现在的写法同时混用了回调和await两种模式,刚好触发了这个逻辑问题。
修复方案
两种写法二选一即可,绝对不要同时传回调函数又用await等待返回Promise:
- 方案1:纯async/await写法(推荐,适配Next.js API路由的异步写法规范)
去掉第四个回调入参,直接用await接收接口返回值即可,修复后代码如下:
type Data = { responseWord : string } export default async function handler( req: NextApiRequest, res: NextApiResponse<Data>) { const Reverso = require('reverso-api'); const reverso = new Reverso(); console.log("1"); try { const response = await reverso.getContext('Dog', 'English', 'German'); const resultText = response?.text; console.log(resultText); console.log("2"); res.status(200).json({ responseWord: `${resultText}` }); } catch (err) { // 禁止留空catch逻辑,出错时返回明确错误响应,避免请求超时挂起 res.status(500).json({ responseWord: "翻译请求失败" }); } }
- 方案2:纯回调写法
如果要使用回调模式,就去掉await关键字,把响应返回逻辑放到回调函数内部:
type Data = { responseWord : string } export default function handler( req: NextApiRequest, res: NextApiResponse<Data>) { const Reverso = require('reverso-api'); const reverso = new Reverso(); console.log("1"); reverso.getContext('Dog', 'English', 'German', (response: any) => { const resultText = response?.text; console.log(resultText); console.log("2"); res.status(200).json({ responseWord: `${resultText}` }); }).catch((err: any) => { res.status(500).json({ responseWord: "翻译请求失败" }); }); }
额外优化点
- 建议把
reverso-api的导入语句放到文件顶部,不要每次接口请求都重新执行require初始化实例,减少性能开销。 - 原代码中定义在handler外部的
r变量存在并发问题,Serverless环境下多请求同时触发时会互相覆盖值,必须移到handler函数内部定义。
内容的提问来源于stack exchange,提问作者Leonardo Carlassare
相关产品推荐
相关产品推荐

