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 doom
的pyramid 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 – 返回承诺,而不是使用callbacks
( fetch
库这样做)
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 })