簡體   English   中英

Node.js / Koa:在響應之前等待 API 調用

[英]Node.js / Koa: wait for API call before response

我只有基本的 JS 知識(主要是 jQuery),所以這可能是一個非常簡單的知識。 並且確實意識到性能方面它可能不是最好的解決方案,但現在這只是概念證明。

我有這個簡單的 Koa 應用程序。 我要做的就是在訪問 /callapi 路由時調用外部 API (Airtable),並將 API 響應中的一些數據添加到 ctx.body。

但是,我在轉到http://localhost:3000/callapi時得到 404 Not Found 我知道這可能是因為 API 調用是異步的,所以 Z3B2819DD4C24EDA2FAF2FAF2052EEF4495 完成並繼續執行,但等待它執行沒有代碼在其他地方設置響應正文,因此導致 404。

我怎樣才能做到這一點? 如果需要,很高興使用其他路由中間件或其他中間件。

我相信帶有 async/await 的 Promises 是 Koa 所接受的 go 的新方法,所以如果我能以某種方式添加/包裝它,我猜這將是最好的。

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');

看起來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 並重試上述內容。

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);
            }
        });
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM