node.js - Dialogflow agent.add 无法与 Promise 一起使用

标签 node.js google-apps-script google-sheets dialogflow-es

我正在尝试从电子表格返回数据,代码工作正常,数据出现在日志中,但 agent.add 无法按预期工作。

我需要的是使对话框流响应并返回我从电子表格获得的数据。

发生的情况是,在代码的一个位置,对话框流agent.add按预期工作,但它没有返回我从电子表格获取的数据,请参阅这部分:

agent.add("status code inside: "+ myCode); // agent.add working, but myCode variable not showing the data which returned from spreadsheet, it only shows the original value "XmXm"

在代码的其他位置,agent.add不起作用,即使我可以在日志中看到电子表格数据,(我之前尝试过使用和不使用return agent.add)请参阅这部分

return agent.add("status code outside:"+ value); // function agent.add whether or not I add return before it

请注意,我尝试了 stackoverflow 中提供的许多解决方案,但我仍然无法修复它,下面是我的完整代码:

  function sheetPromiseHandelerGet(orderNum){
  	const jwtClient = authSheet();  	  
let getSheetPromise = new Promise((resolve, reject) => { 
  const mySpreadSheetId = 'SHEET_ID';
  const sheetName = "SHEET_NAME";
  let myCode = "XmXm"; // give myCode a string value for testing
  let testFirst = 0;
  sheets.spreadsheets.values.get(
    {
      auth: jwtClient,
      spreadsheetId: mySpreadSheetId,
      range: `${sheetName}!A:H`
    },
    (err, res) => {
      if (err) {
        console.error(err);
        return;
      }
      const data = res.data.values;
      let i = 0;
      for (i = 0; i < data.length; i++) {
        if (orderNum == data[i][0]){
          myCode = `myCode: Order details: ${data[i][1]}`;
          resolve(myCode);
        } 
      }
    }
  );
  agent.add("status code inside: "+ myCode); // agent.add working, but myCode variable not is "XmXm"
});
   return getSheetPromise.then(function(value) {
	console.log(value); // the value (which is the result comes from spreadsheet) appears correctly in the debugger, 
	return agent.add("status code outside:" value);  // function agent.add whether or not I add return before it 
});
  }
  
  
  function orderStatusHandel(agent){
const detailsNum = agent.parameters.detailsNum;
sheetPromiseHandelerGet(detailsNum);
  }
  
  function authSheet(){
//
  }
  
  

我将非常感谢您的帮助!

最佳答案

最后经过多次尝试,我找到了答案,很简单,我想在调用主函数sheetPromiseHandelerGet(detailsNum)之前添加return,该函数调用sheetPromiseHandelerGet(orderNum),就这样

所以如果你在问题中查看我的代码末尾,而不是

function orderStatusHandel(agent){
    const detailsNum = agent.parameters.detailsNum;
    sheetPromiseHandelerGet(detailsNum); //return is missing
}

一定是

function orderStatusHandel(agent){
    const detailsNum = agent.parameters.detailsNum;
    return sheetPromiseHandelerGet(detailsNum); //return has been added
}    

除此之外,最好进行其他更改:

resolve(myCode);

成为

resolve(agent.add(myCode));

希望可以帮助有同样问题的人

关于node.js - Dialogflow agent.add 无法与 Promise 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59125963/

相关文章:

node.js - MongoDB-Memory-Server 使 jest 测试调试卡在 WSL 上

Node.js - 并发写入和读取对象

google-apps-script - 具有不同首页标题的文档上的 Google Apps 脚本定位标题

r - 将带有公式的Google Spreadsheet导入R

javascript - 在 Google 表格中跨行添加数字

node.js - 使用 Nodejs 重试 Cassandra 中的策略

javascript - 如何从 mac 中完全删除 Ionic 和 Cordova 安装?

google-apps-script - 如何以编程方式获取谷歌驱动器文件的文件(视频)持续时间?

javascript - 将谷歌表单响应行复制到新工作表中

csv - 在gdrive上的单个文件中合并多个CSV文件