我正在使用 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()
,这很奇怪。
从我的角度看,您的代码存在一些问题:
async
和 .then()/.catch()
。 这在技术上并没有错,但通常不会按照您期望的方式运行。如果你对 async/await
和 .then()/.catch()
有足够的了解来混合它们,那么你就不会混合它们。 如果你不够了解,那么你就不应该混合它们😁return
一个值或一个 Promise 作为 CF 代码已完成的明确指示。 Doug 在 Learn JavaScript Promises (Pt. 2) with a Firestore Trigger in Cloud Functions