Node.js/Koa:如何等待API调用完成后再返回响应?
解决Koa路由中异步API调用导致的404错误
你的推测完全正确!问题出在你使用了Airtable SDK的回调形式,而await关键字只能等待Promise对象,无法等待回调函数执行完成。这就导致Koa的路由中间件在触发API调用后直接结束流程,还没等API返回结果就继续往下走,此时ctx.body还没被设置,所以返回了404错误。
解决方案:改用Airtable SDK的Promise形式
Airtable的Node.js SDK本身支持Promise风格调用——只要你不传入回调函数,它的方法就会返回一个Promise,这样就能用async/await正确等待异步操作完成了。
修改后的完整代码如下:
const KoaRoute = require('koa-route'); const Koa = require('koa'); const app = new Koa(); var Airtable = require('airtable'); var base = new Airtable({apiKey: 'keyI6rZxwsXXXXXXX'}).base('appXXXXXX'); app.use(KoaRoute.get('/callapi', async function (ctx) { try { // 移除回调函数,直接await Promise返回的结果 const record = await base('Couples').find('reclnxjiMeSljrzP0'); console.log('Retrieved', record.id); ctx.body = "Record ID from API: " + record.id; } catch (err) { // 捕获API调用可能出现的错误,避免中间件崩溃 console.error('Error retrieving record:', err); ctx.status = 500; ctx.body = 'Failed to fetch data from Airtable'; } })); app.listen(3000); console.log('listening on port 3000');
关键改动说明:
- 去掉
base('Couples').find()的回调参数,让方法返回Promise,这样await才能生效 - 用
try/catch块包裹异步操作,处理API调用可能出现的网络错误、权限错误等异常,同时给客户端返回合理的错误状态码和提示
这样修改后,Koa会等待Airtable API调用完成后再设置ctx.body并返回响应,404的问题就解决了。
内容的提问来源于stack exchange,提问作者Waldemar
相关产品推荐
相关产品推荐

