Microsoft Bot Framework问题:使用next传递响应未在后续函数生效
我之前在Microsoft Bot Framework开发时也碰到过一模一样的问题——用next传递的响应在后续函数里死活拿不到,当时折腾了好一阵!咱们来一步步排查常见的坑:
常见问题及解决办法
确认
next的调用逻辑是否正确
Bot Framework的中间件/流程函数里,next()本身并不用来直接传递响应数据,而是用来触发后续流程的执行。正确的做法是把需要传递的响应或数据挂载到turnContext对象上,再调用next():
错误示例:// 这种写法完全不对,next不接收响应参数 async function firstStep(turnContext, next) { const myResponse = "要传递的内容"; next(myResponse); }正确示例:
async function firstStep(turnContext, next) { // 直接发送响应(后续流程能看到这个已发送的activity) await turnContext.sendActivity("这是第一步的响应"); // 或者把自定义数据存在turnContext的自定义属性里 turnContext.customResponseData = "后续函数要用的数据"; // 调用next触发后续流程 await next(); }检查中间件/流程的注册顺序
Bot Framework的中间件是按注册顺序依次执行的,如果你的"后续函数"注册在设置响应的函数之前,那它自然拿不到还没被设置的数据:
错误顺序:// 先注册了后续处理函数,再注册产生数据的函数 adapter.use(postProcessingMiddleware); adapter.use(preProcessingMiddleware);正确顺序:
// 先注册生成数据/响应的函数,再注册需要使用这些内容的后续函数 adapter.use(preProcessingMiddleware); adapter.use(postProcessingMiddleware);确保异步操作完成后再调用
next
如果你的响应是通过异步请求(比如调用API、查询数据库)获取的,一定要用await等待操作完成,再调用next(),不然后续函数执行时数据还没准备好:async function dataFetchMiddleware(turnContext, next) { // 等待异步请求完成,拿到数据 const apiResponse = await fetchUserInfo(turnContext.activity.from.id); // 把数据挂载到turnContext上 turnContext.userData = apiResponse; // 再触发后续流程 await next(); }检查后续函数的访问路径是否正确
有时候不是数据没传过来,而是你找错地方了!比如你把数据存在turnContext.activity.myData里,结果在后续函数里去turnContext.myData找,自然会找不到。
如果还是解决不了,把你的代码片段贴出来,能更精准地定位问题~
内容的提问来源于stack exchange,提问作者JLP
相关产品推荐
相关产品推荐

