云函数中如何处理监听器 | Discord.js

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

我正在使用 Discord.js 通过 Firebase 的云功能创建一个机器人。用户从应用程序客户端访问功能并操作 Discord Bot。

在下面的代码中,调用了

discord_test
并添加了
client.on
监听器。这将在调用
client.login()
后返回响应。

exports.discord_test = functions.https.onCall(async (data, context) => {
    console.log("1");
    client.on("ready", async () => {
        console.log("3");
        const snap = await db.collection(colName).doc(docName).get().catch((e) => {
            console.error(e);
        });
        console.log("4");
    });

    console.log("2");
    await client.login(token.token);
});

如你所见,我设置了一个输出1到4的日志。假设按顺序调用数字1到4。

多次运行此命令,结果将如下所示:

第一次:

函数执行开始

可调用请求验证通过

1

2

函数执行花费了 2220 毫秒,完成状态代码:200

3

4
没有被叫到。

第二次:

函数执行开始

可调用请求验证通过

1

2

函数执行花费了 1689 毫秒,完成状态代码:200

3
4
没有被叫到。

我执行的时间
firebase deploy --only functions
(第二次后大约10分钟)

3

4

第三次:

函数执行开始

可调用请求验证通过

1

2

函数执行花费了 2100 毫秒,完成状态代码:200

无论我等多久,

3
4
都永远不会被叫到。


从这个结果我们可以看到,

client.on()
第二个参数中写的函数,有时候会突然阻塞,有时候又突然加载。

当然,我明白这是听者,所以计时关闭并没有什么奇怪的。

所以我想问的是,Cloud Function 为这个监听保留了多少时间,以及为什么中途会中断处理。

部署时加载了

client.on()
,这很奇怪。

javascript firebase google-cloud-functions discord.js
1个回答
0
投票

从我的角度看,您的代码存在一些问题:

  1. 您正在混合使用
    async
    .then()/.catch()
    。 这在技术上并没有错,但通常不会按照您期望的方式运行。如果你对
    async/await
    .then()/.catch()
    有足够的了解来混合它们,那么你就不会混合它们。 如果你不够了解,那么你就不应该混合它们😁
  2. 云函数并不意味着“长时间运行”。 最长运行时间为 5 分钟,此时云函数引擎将关闭它。他们不适合操作“机器人”。
  3. 您的 CF 代码没有向 CF 引擎返回值,因此它无法正确确定异步代码何时完成。 这会让您的代码受 CF 引擎的支配。 您想要
    return
    一个值或一个 Promise 作为 CF 代码已完成的明确指示。 Doug 在 Learn JavaScript Promises (Pt. 2) with a Firestore Trigger in Cloud Functions
  4. 中介绍了这一事实
© www.soinside.com 2019 - 2024. All rights reserved.