使用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处理异常 }); } }
修改要点说明
- 调整Promise链结构:把第二个axios请求返回出去,让它成为Promise链的一部分,这样外层的Promise会等待所有异步操作完成后才resolve。
- 使用箭头函数:避免了
bind带来的上下文混乱,直接保留外层的conv引用,赋值更可靠。 - 统一错误处理:把所有catch合并,确保任何一步出错都会抛出异常,让Actions on Google能正确捕获错误。
- 延迟resolve时机:只有当第二个axios请求完成,并且
conv.user.storage.caseNumber赋值完成后,Promise才会自然resolve,这时候对话流程才会继续,存储的内容也会被持久化。
你可以测试一下这个修改后的版本,应该能正常把caseNumber存入用户存储了。
内容的提问来源于stack exchange,提问作者ELJON G
相关产品推荐
相关产品推荐

