2017-08-24 2 views
-1

Ich möchte einen Back-End-Aufruf an eine externe API und füllen Sie meine Seite mit den Ergebnissen. Was ist der beste Weg, dies zu tun?Express - Nodejs externe Pause api Anruf

Der "request.get" -Aufruf ist asynchron, daher verstehe ich, dass der folgende Code fehlerhaft ist. Ich habe es jedoch so geschrieben, dass ich erklären kann, was ich eigentlich tun möchte.

Weitere, ich habe vielleicht 5-6 externe API, gibt es eine Möglichkeit, diese asynchrone für jeden api aber synchronen Anruf zu machen? Diese

ist, wie meine aktuellen Code wie folgt aussieht:

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

} 

Antwort

0

Sie können wickeln getRawApiResponse() in einem Versprechen

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

, die auf Erfolg löst und lehnt im Falle eines Fehlers, dann können Sie die Kette es im Inneren des Erhaltungs-Anforderung wie

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

}); 
0

Blick in Promises oder Asynchron/await. Sie können sie verwenden, um Ihre asynchrone API aufzurufen und auf die Antwort zu warten, die den Aufruf synchron macht.

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

Ein Beispielcode von Asynchron/await, die u für ur Zweck ändern kann, ist wie folgt:

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

Der beste Weg ist, Versprechen zu verwenden Rückrufe Hölle zu vermeiden. Wenn Sie node.js v7.6 oder höher verwenden können, könnte es mit async/await viel einfacher sein.

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

Im Beispiel über verwende ich promisification ein Versprechen von getRawApiResponse zurückzukehren, aber es ist schon ein Modul, das die gleichen https://github.com/request/request-promise tun.