Express.js从外部API检索信息并渲染到网站

我有点困扰如何处理这个解决scheme。 我目前正在使用的框架是node.js和express.js与帕格意见/呈现HTML。 我想要做的是渲染到一个页面,并使用来自不同网站的单独http获取请求的值。 我想expression/节点来查询外部API,并呈现一个视图,我会通过从客户端JavaScript的Ajax调用检索。 从客户端使用jQuery的ajax调用我已经想通了。 我的问题是如何处理多个外部API调用,并将结果放入一个对象,以在我的帕格视图中呈现。 我不确定最好的做法是如何正确执行。 我是否创build模型? 另外,我如何处理asynchronoushttp获取? 使用承诺? 我对节点和JavaScript是一种新的,所以我想看看最好的约定使用。 我希望这是有道理的。

谢谢!!!!

apiInfoModel.js

var apiCallInfo = { apiInfo1: APIDATA apiInfo2: APIDATA2 apiInfo3: APIDATA3 } 

我应该有一个函数,我会打电话返回APIDATA?

apiCalls.js

 function getApiInfo1() { return http.get } function getApiInfo2() { return http.get } function getApiInfo3() { return http.get } 

apiInfoController.js

 var apiInfo = require('./apiInfoModel') var apiCalls = require('./apiCalls') exports.apiInfo = function(req,res,next){ apiInfo.apiInfo1 = apiCalls.getApiInfo1 apiInfo.apiInfo2 = apiCalls.getApiInfo2 apiInfo.apiInfo3 = apiCalls.getApiInfo3 res.render('apiInfo',{apiInfo: apiInfo}) } 

扩展评论@Mauricio Noris Freire

apiCalls.js – 添加callback参数

 function getApiInfo1(cb) { return cb(http.get) } function getApiInfo2(cb) { return cb(http.get) } function getApiInfo3(cb) { return cb(http.get) } 

apiInfoController.js – 嵌套callback以访问所有结果

 var apiInfo = require('./apiInfoModel') var apiCalls = require('./apiCalls') exports.apiInfo = function(req,res,next){ apiCalls.getApiInfo1(function(info1Result) { apiCalls.getApiInfo2(function(info2Result) { apiCalls.getApiInfo3(function(info3Result) { // now you have all 3 results apiInfoResult = { apiInfo1: info1Result, apiInfo2: info2Result, apiInfo3: info3Result } res.render('apiInfo', { apiInfo: apiInfoResult }) }); }); }); } 

这个嵌套结构被称为pyramid of doompyramid of doom因为它随着你需要做的每一个asynchronous操作而不断增长。 可以通过使用像async https://www.npmjs.com/package/async这样的实用程序库来改进:

  async.parallel( [ apiCalls.getApiInfo1, apiCalls.getApiInfo2, apiCalls.getApiInfo3 ], function(error, apiInfoResult) { apiInfoResult = { apiInfo1: info1Result, apiInfo2: info2Result, apiInfo3: info3Result } res.render('apiInfo', { apiInfo: apiInfoResult }) }); 

但目前推荐的方法是使用Promises 。 这是JavaScript引入的一个新的API来处理这种情况。 它在最近的NodeJS版本中可用。 它消除了callbacks的需要:

apiCalls.js – 返回承诺,而不是使用callbacksfetch库这样做)

 require('whatwg-fetch') function getApiInfo1() { return fetch() } function getApiInfo2() { return fetch() } function getApiInfo3() { return fetch() } 

apiInfoController.js – 使用Promise.all

  const [ apiInfo1, apiInfo2, apiInfo3 ] = Promise.all([apiCalls.getApiInfo1, apiCalls.getApiInfo2, apiCalls.getApiInfo3]); apiInfoResult = { apiInfo1, apiInfo2, apiInfo3 } res.render('apiInfo', { apiInfo: apiInfoResult })