Express.js从外部API检索信息并呈现到站点

时间:2017-07-27 13:43:09

标签: javascript node.js express

我有点坚持如何处理这个解决方案。我目前正在使用的框架是node.js和express.js,其中包含用于视图/渲染html的pug。我想要做的是渲染到单个页面并使用来自不同站点的单独http get请求的值。我希望express / node查询外部api并呈现我将通过客户端javascript的ajax调用检索的视图。我已经想到了使用客户端jquery的ajax调用。我的问题是如何处理多个外部API调用并将结果放入一个对象中以在我的哈巴狗视图中呈现。我不确定执行此操作的最佳做​​法是什么。我创建一个模型吗?另外,我如何处理异步http获取?使用承诺?我是节点和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})
}

1 个答案:

答案 0 :(得分:1)

扩大@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 - 嵌套回调以访问所有结果

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,因为它随着您需要执行的每个异步操作而不断增长。可以使用像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。这是API中引入的新JavaScript来处理这种情况。它在最近的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 })