Slack Bolt API:提交操作时更新模态视图遭遇'not_found'错误
解决Slack模态视图view_submission中update失败的问题
我之前也碰到过一模一样的问题,核心原因是在view_submission事件里,你不能先调用空的ack()再单独执行client.views.update——当你执行await ack()却不带任何参数时,Slack会默认判定你要关闭当前模态视图,此时原视图的view_id会立即失效,后续再调用views.update自然会返回not_found错误。而在app.actions()里处理模态内按钮点击时,视图还处于活跃状态,所以直接调用views.update能正常生效。
正确解决方案:通过ack()参数直接返回更新指令
在view_submission事件中,Slack支持你通过ack()的参数直接指定response_action来更新当前视图,这样就能在确认提交请求的同时完成视图替换,完全不需要单独调用client.views.update。
修改你的代码如下:
app.view('callback_period', async ({ ack, body, view, client }) => { try { // 在ack中直接携带更新动作和新视图配置 await ack({ response_action: "update", view: views_payroll_prefill_shift }); console.log("视图更新成功"); } catch (error) { console.error("视图更新失败:", error); } });
为什么这种方式可行?
当你在ack()里传入response_action: "update"和新视图对象时,Slack会以原子性的方式处理:先确认提交请求,同时直接用新视图替换当前模态视图,整个过程中视图的状态是连续的,不会出现原视图ID失效的问题。
额外注意点
- 如果需要先处理用户输入(比如表单验证、调用外部接口)再更新视图,要确保整个处理流程在3秒内完成(Slack要求的响应超时时间)。如果处理时间超过3秒,你需要先调用空的
ack()确认请求,之后用client.views.push打开新的模态视图(因为此时原视图已经被关闭,无法再执行update操作)。 - 要确认
views_payroll_prefill_shift的结构完全符合Slack模态视图的规范,没有语法或格式错误,否则也可能导致更新失败。
内容的提问来源于stack exchange,提问作者Mike Budgell
相关产品推荐
相关产品推荐

