2017-07-27 80 views
1

我有点困扰如何处理这个解决方案。我目前正在使用的框架是node.js和express.js,带有用于视图/呈现html的pug。我想要做的是渲染到一个页面,并使用来自不同网站的单独http获取请求的值。我希望express/node查询外部API,并呈现一个视图,我将通过来自客户端JavaScript的ajax调用来检索。我已经找到了从客户端使用jQuery的ajax调用。我的问题是如何处理多个外部API调用,并将结果放入一个对象中以在我的帕格视图中呈现。我不确定最佳做法是什么才能正确执行此操作。我是否创建模型?另外,我如何处理异步http获取?使用承诺?我对节点和JavaScript都很陌生,所以我试图看看最好的约定是什么。 我希望这是有道理的。Express.js从外部API检索信息并渲染到网站

谢谢!

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}) 
} 
+0

您可能必须将apiInfo2的调用作为getApiInfo1的回调等。 –

回答

1

为了扩大对@Mauricio诺里斯·弗莱雷

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 - 巢回调不得不所有结果

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访问。它可以通过使用工具库一样asynchttps://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 }) 
+0

谢谢@morgh!至于我如何创建对象,我总是不确定是以传统的方式来对待它,还是将它们混合在一起。我想我问我的“模式” – fabricatedmind

+0

然后,你可能想看看这个开源书系列:https://github.com/getify/You-Dont-Know-JS。他们使用干净的编码习惯,你应该可以学习。此外,“异步”书中有更多关于我提到的所有回调/承诺的信息。 – shotor