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

使用Actions on Google Node.js库无法将Axios返回数据存入conv.user.storage

问题分析与解决方案

看起来你遇到的核心问题是Promise执行时机错误,导致在conv.user.storage.caseNumber赋值完成之前,对话就已经结束了,所以存储的内容没有被持久化。另外你的代码里bind的使用也有点绕,容易导致上下文混乱,我们一步步来修复:

核心问题拆解

你当前的代码中,外层Promise的resolve()是在第一个axios请求的then回调里直接调用的,这时候第二个创建Case的axios请求还在异步执行中。Actions on Google会在Promise resolve后立即结束对话流程,根本等不到你给conv.user.storage.caseNumber赋值的操作完成。

另外,用bind({conv: conv})的方式传递上下文没必要,箭头函数可以更简洁地保留外层的conv引用。

修改后的代码

Proxy.js

module.exports = function () {
  this.createCase = function (conv) {
    // 返回一个包含所有异步操作的Promise
    return axios.post('https://mysite.my.salesforce.com/services/oauth2/token', querystring.stringify(params))
      .then(response => {
        const caseData = {
          "account": conv.user.storage.accountId,
          "recordType": conv.user.storage.recordTypeId,
          "priority": conv.user.storage.priority,
          "subject": conv.user.storage.subject,
          "description": conv.user.storage.description
        };
        // 嵌套第二个axios请求,确保顺序执行
        return axios.post(
          'https://mysite.my.salesforce.com/services/apexrest/voicetocase/create',
          caseData,
          {
            headers: {
              'Authorization': "Bearer " + response.data.access_token,
              'Content-Type': 'application/json'
            }
          }
        );
      })
      .then(response => {
        // 这里确保请求完成后再赋值
        conv.user.storage.caseNumber = response.data.caseNumber;
        console.log('存储的caseNumber:', conv.user.storage.caseNumber); // 可以再确认一次
      })
      .catch(error => {
        console.error('请求错误:', error);
        throw error; // 抛出错误让Actions on Google处理异常
      });
  }
}

修改要点说明

  1. 调整Promise链结构:把第二个axios请求返回出去,让它成为Promise链的一部分,这样外层的Promise会等待所有异步操作完成后才resolve。
  2. 使用箭头函数:避免了bind带来的上下文混乱,直接保留外层的conv引用,赋值更可靠。
  3. 统一错误处理:把所有catch合并,确保任何一步出错都会抛出异常,让Actions on Google能正确捕获错误。
  4. 延迟resolve时机:只有当第二个axios请求完成,并且conv.user.storage.caseNumber赋值完成后,Promise才会自然resolve,这时候对话流程才会继续,存储的内容也会被持久化。

你可以测试一下这个修改后的版本,应该能正常把caseNumber存入用户存储了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:06:44