2017-08-24 17 views
-1

私は外部apiのバックエンド呼び出しを行い、結果をマイページに取り込みたいと考えています。これを行う最善の方法は何ですか?Express - Nodejs外部休憩APIコール

"request.get"呼び出しが非同期であるため、以下のコードは誤りであると私は理解しています。しかし、私は実際にやりたいことを説明できるように、それを書いています。

さらに、私は5-6の外部APIを持っているかもしれませんが、このAPIを非同期にする方法はありますか?

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

あなたが約束成功に解決した後、あなたが

router.get('/', function(req, res, next) { 
    getRawApiResponse("someURL") 
      .then(function(body){ 
       res.render('index', { title: 'Express', api: "some", body: body}); 
      }) 
      .catch(err){ 
       // do something 
      } 

}); 
のようなGETリクエストの内側にそれをチェーンすることができ、エラーの場合には拒否

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

でgetRawApiResponseを()ラップすることができます

0

約束またはasync /のawaitを調べる:

これは私の現在のコードがどのように見えるかです。それらを使用して非同期APIを呼び出し、応答を待って呼び出しを同期させることができます。

http://bluebirdjs.com/docs/getting-started.html

uはウルの目的のために変更することができます非同期/の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); 
       } 
      }); 
    }); 
} 
0

最良の方法は、コールバック地獄を避けるために約束を使用することです。 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); 
    }); 
    }); 
} 

私はgetRawApiResponseからの約束を返すためにpromisificationを使用しますが、同じhttps://github.com/request/request-promiseを行うモジュールがすでに存在している程度。