【发布时间】: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