【问题标题】:Node.js GET API is getting called twice intermittentlyNode.js GET API 被间歇性调用两次
【发布时间】:2022-01-28 02:20:45
【问题描述】:

我有一个 node.js GET API 端点,它调用一些后端服务来获取数据。

app.get('/request_backend_data', function(req, res) {

   ---------------------
}

当从后端服务返回响应存在延迟时,此端点(request_backend_data)将在 2 分钟后准确触发。我检查了我的应用程序代码,但是当有延迟时,任何地方都没有写重试逻辑。 在任何情况下(如延迟或超时)是否会调用 node.js API 端点两次?

【问题讨论】:

  • Nani,尝试使用 Wireshark 或 Charles(对于 mac)检查线路中的情况。这些应用程序可以向您显示所有带有时间码的 http 请求。
  • 你检查过第一个和第二个请求的请求数据,是一样的吗?怎么理解endpoint被调用了两次,能否提供一个伪代码?
  • 第一个和第二个请求的请求数据相同。请参阅以下日志 [2022-01-13 15:25:29.901] [INFO] api.js - 触发 API######################### ################# [2022-01-13 15:25:31.026] [INFO] service.js - 后端_service :: 成功获取数据。 [2022-01-13 15:27:29.902] [INFO] api_dashboard.js - 触发 API############################# ##############
  • 1.您是否直接调用端点request_backend_data,中间没有任何第三方服务器,如代理、负载平衡器或路由器? 2. 由于第 3 方的延迟,当您的代码中未处理传入请求时,可能是内部配置错误,然后请求被重新路由回同一端点? 2 分钟看起来像一些默认的 http 请求处理超时。您的处理程序和快速路由器配置的源代码会有所帮助。

标签: node.js rest http callback get


【解决方案1】:

可能有几个原因:

  • 某些 chrome 扩展可能会导致错误。这些 chrome 扩展最近引起了很多问题。在不同的浏览器上运行您的应用程序。如果没有问题,则表示这是特定于 chrome 的问题。

  • express 可能正在请求 favicon.ico。为了防止这种情况,请使用此模块:https://www.npmjs.com/package/serve-favicon

  • 添加 CORS 策略。您的服务器可能会发送预检请求使用此 npm 包:https://www.npmjs.com/package/cors

【讨论】:

  • 你能详细说明一下CORS部分吗?在什么情况下发出预检请求?
【解决方案2】:

不,在 nodejs 或类似的东西中没有默认超时。

在您的前端部分寻找问题:

  1. 可以是带有“重试”选项集的 javascript fetch api
  2. 可能会弄乱 RxJS 运算符链,隐式发出事件并触发另一个 REST 请求
  3. 可以在超时时重新加载整个页面,这会导致从后端检索所有必要的数据
  4. 可以是请求拦截器(在 axios、angular 等中),它可以修改某些内容并重新发送

...许多潜在的原因,但肯定不是后端(nodejs)

只需做一个简单的例子,然后用 axois 或 xmlhttprequest 调用你的 nodejs 'request_backend_data' 端点——你会发现问题不在后端。

【讨论】:

    【解决方案3】:

    尝试使用以下代码检查 api 调用,其中包括以下重定向。根据需要添加标题(即'Authorization': 'bearer dhqsdkhqd...etc'

    var https = require('follow-redirects').https;
    var fs = require('fs');
    
    var options = {
      'method': 'GET',
      'hostname': 'foo.com',
      'path': '/request_backend_data',
      'headers': {
      },
      'maxRedirects': 20
    };
    
    var req = https.request(options, function (res) {
      var chunks = [];
    
      res.on("data", function (chunk) {
        chunks.push(chunk);
      });
    
      res.on("end", function (chunk) {
        var body = Buffer.concat(chunks);
        console.log(body.toString());
      });
    
      res.on("error", function (error) {
        console.error(error);
      });
    });
    
    req.end();
    

    粘贴到名为 test.js 的文件中,然后使用 node test.js 运行。

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2020-12-03
      • 1970-01-01
      • 2012-08-01
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      相关资源
      最近更新 更多