You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用set_state无法设置FSM状态,触发TypeError错误求助

Telegram机器人FSM状态设置无效问题排查与修复

1. 确认FSM基础配置正确性

首先检查Form状态类的定义,必须正确继承StatesGroup:

from aiogram.fsm.state import StatesGroup, State

class Form(StatesGroup):
    user = State()
    item_photo = State()

同时确保机器人初始化时配置了状态存储(开发环境可用内存存储):

from aiogram.fsm.storage.memory import MemoryStorage

storage = MemoryStorage()
dp = Dispatcher(storage=storage)

2. 补全回调确认操作

回调处理器中必须调用call.answer(),否则Telegram服务器会认为回调未处理,导致状态无法持久化。修改代码如下:

@router.callback_query()
async def callback(call: CallbackQuery, state: FSMContext):
    match call.data:
        case 'first': 
            await state.set_state(Form.user)
            await call.message.answer('Введите пользователя следуя инструкциям')
            await call.answer()

        case 'second': 
            await state.set_state(Form.item_photo)
            await call.message.answer('Пришлите фото')
            await call.answer()
            
        case 'third': 
            await call.message.answer('later')
            await call.answer()
        case 'back': 
            await call.message.answer('later')
            await call.answer()

3. 修复状态获取的错误逻辑

报错TypeError: NoneType object cannot be used in expect expression,是因为用None值做了模式匹配。后续处理器中需先判断状态是否存在,再进行逻辑处理:

@router.message()
async def process_input(message: Message, state: FSMContext):
    current_state = await state.get_state()
    # 避免直接用None做模式匹配
    if current_state == Form.user.state:
        # 处理用户输入逻辑
        pass
    elif current_state == Form.item_photo.state:
        # 处理图片上传逻辑
        pass

4. 测试验证

在回调中添加状态打印,确认设置是否生效:

case 'first': 
    await state.set_state(Form.user)
    current_state = await state.get_state()
    print(f"当前状态: {current_state}")  # 预期输出类似 'Form:user'
    await call.message.answer('Введите пользователя следуя инструкциям')
    await call.answer()

内容的提问来源于stack exchange,提问作者Cmilo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:12:34