【问题标题】:Firebase functions using soap finishing with ECONNRESET "socket hang up"Firebase 函数使用带有 ECONNRESET \"socket hang up\" 的肥皂整理
【发布时间】:2022-10-07 22:44:05
【问题描述】:

我有一个过去两年一直在运行的 Firebase 函数,它在我没有任何干预的情况下停止工作(没有代码更改或库更新)。

它用于使用soap从外部服务检索数据,解析数据并将其发送回一个Android应用程序的客户端,现在它以错误“socket hang up”终止。

这是我用于调查的 firebase 函数的简化:

import * as soap from "soap";
import * as constants from "constants";
import * as functions from "firebase-functions";
import * as admin from "firebase-admin";

export const getMakeManual = functions.region("europe-west1").https.onRequest(async (req, res) => {
      const url = functions.config().wsdl.path;
      const paths12 = functions.config().certificate.path;
      const password = functions.config().certificate.pwd
    
      const security = new soap.ClientSSLSecurityPFX(paths12, password);
      security.addOptions({
        strictSSL: false,
        rejectUnauthorized: false,
        secureOptions: constants.SSL_OP_NO_TLSv1_2,
        forever: false,
      });
    
      const getMakeArgs = {
        id: functions.config().id,
      };
    
      await soap.createClientAsync(url).then(async (client) => {
        client.setSecurity(security);
        await client.getMakeAsync(getMakeArgs).then((result : any) => {
          const rawResponseIndex = 1;
          console.log(result[rawResponseIndex]);
        }).catch((error : any) => {
          console.log(error);
        });
      });
    });

这是我的 package.json 的 sn-p :

  "engines": {
    "node": "16"
  },
  "main": "lib/index.js",
  "dependencies": {
    "fast-xml-parser": "^4.0.8",
    "firebase-admin": "^11.0.1",
    "firebase-functions": "^3.24.0",
    "googleapis": "^107.0.0",
    "soap": "^0.45.0"
  },

这是日志中的一个 sn-p:

Error: socket hang up
>      at connResetException (node:internal/errors:692:14)
>      at TLSSocket.socketOnEnd (node:_http_client:478:23)
>      at TLSSocket.emit (node:events:539:35)
>      at endReadableNT (node:internal/streams/readable:1345:12)
>      at processTicksAndRejections (node:internal/process/task_queues:83:21) {
>    code: 'ECONNRESET',

到目前为止我所知道的:

  • 如果我删除“client.setSecurity(security);”,错误似乎是由安全选项引起的将服务答案与预期的“403 Forbidden”对齐。
  • 我已经联系了运行该服务的公司,他们告诉我他们没有改变任何东西。
  • 我已经联系了 Firebase 的支持,他们没有任何支持。
  • 我在本地运行我的函数,并通过 Wireshark 检查是否没有发生通信并且确实如此。我的功能和服务之间存在帧交换。

我不得不承认我在这里有点迷路了。我正在考虑使用另一个 saop 库,但我不希望观察到任何变化......我可以做其他测试吗?

【问题讨论】:

  • 您没有从函数返回响应。在所有处理完成后尝试添加res.end()
  • 我尝试添加 res.end() 它只解决了我在控制台中的警告。无论如何,最初在不需要它的onCall 函数中检测到错误。
  • 我已经推动了我的调查,我认为我正在做一些事情。如果我查看通信交换的详细信息,我会发现它是在 TLS1.3 中完成的,但在代码中它被设置为 TLS1.2。根据这个link 两个版本没有相同的握手。由于 1.3 更快,因此我遇到一个看起来像超时问题的错误也就不足为奇了。

标签: javascript node.js firebase soap google-cloud-functions


【解决方案1】:

我发现了我的问题。

证书已过期。给我带来这个问题的唯一工具是 curl,其他所有工具都给了我 ECONNRESET 一个。

然后我用openssl检查了有效期,确实过期了。

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多