使用Azure Durable Function实现数据聚合遇TypeError问题求助
开发Azure Function时遇到技术瓶颈,需求如下:
- 函数通过HTTP调用,首次请求传入需接收的数据包数量等参数,返回实例ID
- 之后额外调用n次传输每个整数数据包
- 全部接收完成后处理数据,输出接收的整数数量
目前遇到的问题:编排器在接收任何数据前就抛出TypeError: Object of type coroutine is not JSON serializable错误,已编写客户端函数接收数据并启动编排器,但始终找不到原因。
编排器函数代码:
async def orchestrator_function(context: df.DurableOrchestrationContext): input_data = context.get_input() n_count = int(input_data['n_count']) # there are some other parameters, but they are not relevant my_data = [] for i in range(n_count): result = await context.wait_for_external_event("get_data") my_data.append(result) total_received = len(df) return total_received
先修正代码中的明显笔误
编排器代码最后计算接收数量时,错误引用了未定义的df变量,应替换为存储数据的my_data:
total_received = len(my_data) # 替换原代码的len(df)
这个错误虽不是序列化报错的直接原因,但会导致后续逻辑异常,优先修正。
序列化错误的核心排查方向
客户端触发外部事件的异步处理问题
检查客户端代码中触发外部事件的逻辑:如果调用Durable Functions的raise_event类方法时未使用await,会传递coroutine对象而非实际数据,进而引发JSON序列化失败。确保客户端调用触发事件的方法时正确等待异步操作完成。编排器输入数据的合法性
确认首次启动编排器时传入的input_data(包含n_count等参数)是完全可JSON序列化的结构,避免字典中包含不可序列化的对象(如datetime、自定义类实例等)。可在客户端发起请求前,对输入数据做一次JSON序列化测试。Durable Functions依赖包版本问题
检查azure-functions-durable包版本,部分旧版本存在异步函数序列化的已知问题,建议升级到最新稳定版本,或回退到经过验证的兼容版本。编排器返回值的序列化检查
当前返回的整数本身可序列化,但需确保后续逻辑扩展后返回的对象均符合JSON序列化要求,避免出现非标准类型的返回值。
内容的提问来源于stack exchange,提问作者Kat

