Node and Express中的端点链:如何防止某些端点停止所有序列?

问题描述 投票:0回答:1

在某些页面中,我必须从8个不同的端点获取信息。其中2个不在我的应用程序范围内,有时它们会导致显示数据的延迟。 Web浏览器等待,直到处理完数据。一旦它们不在我的应用程序之内,我就无法重构它们以使其快速运行,但是我需要显示它们提供的信息。此外,有时其中之一不返回任何内容。如果是这样,我将使用默认数据显示给用户。等待时间需要花费时间才能获得用户体验。

我正在使用诺言来称呼这些端点。下面是我正在使用的部分代码片段。

代码运行正常。问题是延迟。

首先。这是包含我需要处理的所有服务的数组:

        var requests = [{
            // 0
            url: urlLocalApi + '/endpointURL_1/',
            headers: {
                'headers': 'apitoken'
            },
        }, {
            // 1
            url: urlLocalApi + '/endpointURL_2/',
            headers: {
                'headers': 'apitoken'
            },
        ];

数组的代码封装在此方法中:

    const requests = homePageFunctions.createRequest();

现在,这就是处理数据的方式。我同时使用了“ request-promise”和“ bluebird”,以及一个个人记录器来检查是否一切正常。

const Promise = require("bluebird");
const request = require('request-promise');

var viewsHelper = {
    getPageData: function (requests) {
        return Promise.map(requests, function (obj) {
            return request(obj).then(function (body) {
                AppLogger.log(`Endpoint parsed`, statusLogger.infodate);
                return JSON.parse(body);
            });
        });
    }
}

module.exports = viewsHelper;

我怎么称呼它?

    viewsHelper.getPageData(requests)
        .then(results => {
            var output = [];
            for (var i = 0; i < results.length; i++) {
                output.push(results[i]);
            }

            // render data
            res.render('homepage/index', output);
            AppLogger.log(`PageData is rendered`, statusLogger.infodate);
        })
        .catch(err => {
            console.log(err);
        });
};

[在“输出”数组的每个索引项的内部,都有每个端点的每个数据的输出。

这里的问题是:

[如果任何端点花费很长时间,即使 如果它们已经被处理。网页以空白模式等待。

如何防止这种行为?

node.js express promise bluebird
1个回答
0
投票

这是一个有趣的问题,但是我有一些问题才能有效回答。

您具有节点服务器和客户端(HTML / JS)

您有8个端点2太慢,因为您无法控制它们。

  1. 客户(页面)是否知道这8个端点?也就是说,您每次重新加载页面时都会打8个电话?

OR

  1. 页面是否向您的节点JS发出一个请求,并且您的nodeJS同步调用8个端点

如果为1,则由于页面正在发出请求,因此延迟加载将很容易为您工作。

如果为2,则延迟加载将仅在服务器端起作用,但是客户端将被阻止,因为它不知道(或不在乎如何加载数据。该页面发出了一个请求,并且页面被阻止等待该请求。 。

显然,每种方法都有优点和缺点..

您可以解决此问题的一种方法是异步调用节点上的那些端点并对其进行缓存,并且当页面发出1请求时,您就已经准备好数据..

同样,我们对情况了解甚少,有很多方法可以解决此问题

希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.