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 调用是异步的,所以 Node.js / Koa 不要等待它完成并继续执行,但是没有代码在其他地方设置响应主体,所以它结果为 404。
我怎样才能做到这一点?
如果需要,很乐意使用其他路由中间件或额外的中间件。
我相信 async/await 的 Promises 是新的发展方式,Koa 拥抱它,所以如果我能以某种方式添加/包装它,那将是我猜的最好的。
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 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);
}
});
});
}
我只有基本的 JS 知识(主要是 jQuery),所以这可能是一个非常简单的。 并意识到在性能方面它可能不是最好的解决方案,但现在这只是概念证明。
我有这个简单的 Koa 应用程序。我想要做的就是在访问 /callapi 路由时调用外部 API (Airtable),并将 API 响应中的一些数据添加到 ctx.body.
但是,当我去 http://localhost:3000/callapi 时收到 404 Not Found 我理解这可能是因为 API 调用是异步的,所以 Node.js / Koa 不要等待它完成并继续执行,但是没有代码在其他地方设置响应主体,所以它结果为 404。
我怎样才能做到这一点? 如果需要,很乐意使用其他路由中间件或额外的中间件。
我相信 async/await 的 Promises 是新的发展方式,Koa 拥抱它,所以如果我能以某种方式添加/包装它,那将是我猜的最好的。
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 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);
}
});
});
}