Node.js / Koa:在响应之前等待API调用

问题描述 投票:0回答:1

我只有基本的JS知识(主要是jQuery),所以这可能是一个非常简单的知识。并确实意识到性能可能不是最好的解决方案,但是目前这仅仅是概念证明。

我有这个简单的Koa应用。我要做的就是在访问/ callapi路由时调用一个外部API(Airtable),并将来自API响应的一些数据添加到ctx.body。

但是,转到http://localhost:3000/callapi时,我得到404 Not Found我了解这可能是因为API调用是异步的,所以Node.js / Koa不会等待它完成并继续执行,但是没有代码在其他地方设置响应主体,因此结果为404。

我该如何实现?如果需要,很高兴使用其他路由中间件或其他中间件。

我相信Koa接受async / await的Promises是一种新的解决方法,因此,如果我能以某种方式添加/包装它,那将是最好的。

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) {
    await base('Couples').find('reclnxjiMeSljrzP0', function(err, record) {
        console.log('Retrieved', record.id);
        ctx.body = "Record ID from API: " + record.id;
    });
}));


app.listen(3000);
console.log('listening on port 3000');
javascript node.js async-await koa
1个回答
0
投票

[好像await是错误的。请尝试这个。

...
app.use(KoaRoute.get('/callapi', async function (ctx) {
    /* please check return value if it returns correct value. */
    try {
        const record = await getBase();
        console.log('Retrieved', record.id);
        ctx.body = "Record ID from API: " + record.id;
    } catch (err) {
        // handle exception
    }
}));
...

编辑:请添加以下功能,然后在上方重新尝试。

function getBase() {
    return new Promise((resolve, reject) => {
        base('Couples').find('reclnxjiMeSljrzP0', function(err, record) {
            console.log('Retrieved', record.id);
            if (err) {
                reject(err)
            } else {
                resolve(record);
            }
        });
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.