Grammy.js Conversation无报错自行终止问题求助
问题排查:Grammy.js Conversation模块会话终止无响应
核心问题分析
你的代码执行到发送Mahsulot haqida ma'lumot:后无响应,主要有以下几个原因:
- 会话状态对象不一致:开头判断
ctx.session.in_conversation,后续却修改conversation.session.in_conversation,两者可能并非同一实例,导致状态判断失效或会话锁死。 - 缺少异常输入处理:第二个
waitFor(["message"])未配置otherwise回调,若用户发送非文本消息(比如图片、按钮点击),会话会一直处于等待状态,无任何反馈。 - 取消按钮未覆盖全流程:仅在第一步输入后判断取消按钮,第二步等待时用户点击取消无法触发终止逻辑,会话会挂起。
- 变量拼写错误:
descryption应为description(虽不影响当前运行,但易引发后续逻辑问题)。
修正后的代码
if (ctx.session.in_conversation === true) return; ctx.session.in_conversation = true; // 统一使用ctx.session管理状态 await ctx.replyWithChatAction("typing"); await ctx.reply("Mahsulot nomini kiriting:", { reply_markup: cancelKeyboard, }); const nameMsg = await conversation.waitFor(["message"], { otherwise: () => ctx.reply("Iltimos matn ko'rinishida kiriting!"), }); const name = nameMsg.message?.text; if (name === "❌ Bekor qilish") { ctx.session.in_conversation = false; await ctx.reply("🙅♂️ Amal bekor qilindi", { reply_markup: mainKeyboard }); return; } await ctx.reply("Mahsulot haqida ma'lumot:"); const descriptionMsg = await conversation.waitFor(["message"], { // 新增异常处理,同时监听取消按钮 otherwise: async () => { await ctx.reply("Iltimos matn ko'rinishida kiriting!"); // 重新等待用户输入 return conversation.waitFor(["message"], { otherwise: arguments.callee }); }, }); const description = descriptionMsg.message?.text; // 新增第二步的取消判断 if (description === "❌ Bekor qilish") { ctx.session.in_conversation = false; await ctx.reply("🙅♂️ Amal bekor qilindi", { reply_markup: mainKeyboard }); return; } await ctx.reply(`${description}`); ctx.session.in_conversation = false; return;
额外注意事项
- 确保会话状态(
in_conversation)始终通过同一个对象管理(优先使用ctx.session,Grammy中会话默认绑定到ctx.session)。 - 所有
waitFor都应配置otherwise回调,处理非预期输入,避免会话无响应。 - 全流程覆盖取消按钮的判断逻辑,确保用户随时能终止会话。
内容的提问来源于stack exchange,提问作者Anvar Aliyev
相关产品推荐
相关产品推荐

