Node.js / Koa: ожидание вызова API перед ответом - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть только базовые знания JS (в основном, jQuery), так что это может быть очень просто. И осознайте, что с точки зрения производительности это может быть не лучшим решением, но пока это просто доказательство концепции.

У меня есть это простое приложение Koa. Все, что я пытаюсь сделать, это вызвать внешний API (Airtable) при доступе к маршруту / callapi и добавить некоторые данные из ответа API к ctx.body.

Однако я получаю 404 Not Foundпри переходе к http://localhost:3000/callapi я понимаю, что это, вероятно, потому что вызов API является асинхронным, поэтому Node.js / Koa не ждут, пока он завершит и продолжит выполнение, но в другом месте нет кода, устанавливающего тело ответатак что получается 404.

Как мне этого добиться? Рад использовать другое промежуточное программное обеспечение для маршрутизации или дополнительное промежуточное программное обеспечение, если это необходимо.

Я считаю, что Promises с 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) {
    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');

1 Ответ

1 голос
/ 09 ноября 2019

Похоже, 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);
            }
        });
    });
}
...