我想对外部api进行后端调用,并使用结果填充我的页面。这样做的最佳方式是什么?
“request.get”调用是异步的,所以我理解下面的代码是错误的。但是,我已经以这种方式编写了它,以便我可以解释我想要实际做的事情。
此外,我可能有5-6个外部api,有没有办法让这个异步为每个api但同步get调用?
这是我当前代码的样子:
var express = require('express');
var request = require('request');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
var body = getRawApiResponse("someURL");
console.log("Index >" + body);
res.render('index', { title: 'Express', api: "some", body: body});
});
function getRawApiResponse(api){
request.get({
uri: api,
},
function(error, response, body){
if (!error && response.statusCode === 200) {
console.log("Index > Raw Api Response: " + body);
} else {
console.log(error);
}
});
}
答案 0 :(得分:0)
查看Promises或async / await。您可以使用它们来调用异步apis并等待响应使呼叫同步。
http://bluebirdjs.com/docs/getting-started.html
您可以根据目的修改的async / await示例代码如下:
try{
let orderDetails = await MongoHelper.findOneByCriteria(MongoCollections.ORDER,searchCriteria);
}catch(err){
return err;
}
MongoHelper.findOneByCriteria = (collectionName, criteria) => {
return new Promise((resolve, reject) => {
db.collection(collectionName).find(criteria).toArray()
.then((results) => {
if (results.length > 0) {
resolve(results[0]);
} else {
resolve(null);
}
});
});
}
答案 1 :(得分:0)
最好的方法是使用Promises来避免回调地狱。如果你可以使用node.js v7.6或更高版本,使用async / await会更容易。
router.get('/', function(req, res, next) {
getRawApiResponse("someURL")
.then(body => {
console.log("Index >" + body);
res.render('index', { title: 'Express', api: "some", body: body});
});
});
function getRawApiResponse(uri) {
return new Promise((resolve, reject) => {
request.get({ uri }, (error, response, body) => {
if (err) {
reject(err);
}
resolve(body);
});
});
}
在我使用 promisification 从getRawApiResponse
返回承诺的示例中,但已经有一个模块执行相同的https://github.com/request/request-promise。
答案 2 :(得分:0)
您可以将getRawApiResponse()包含在承诺
中function getRawApiResponse(api){
return new Promise(function(resolve, reject){
request.get({
uri: api,
},
function(error, response, body){
if (!error && response.statusCode === 200) {
resolve(body)
} else {
reject(error)
}
});
});
}
取决于成功并在出现错误时拒绝,然后您可以将其链接到get请求中,如
router.get('/', function(req, res, next) {
getRawApiResponse("someURL")
.then(function(body){
res.render('index', { title: 'Express', api: "some", body: body});
})
.catch(err){
// do something
}
});