Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dialogflow es DialogFlow with Webhook Client:Error agent.getContext不是IncomingMessage.resp上的函数_Dialogflow Es - Fatal编程技术网

Dialogflow es DialogFlow with Webhook Client:Error agent.getContext不是IncomingMessage.resp上的函数

Dialogflow es DialogFlow with Webhook Client:Error agent.getContext不是IncomingMessage.resp上的函数,dialogflow-es,Dialogflow Es,我正在使用Firebase云函数进行DialogFlow项目。 我向API发送GET请求,从服务器接收回数据,然后将其显示在fulfillment text属性上。那很好 现在我需要将来自服务器的cookie会话id存储在一种“应用程序变量”中,以便跟踪客户端和服务器之间的交互。 我试图将cookie会话保存在上下文对象中,这样做会出现以下错误: Agent.getContext不是IncomingMessage.resp上的函数 代码如下: exports.dialogflowFirebase

我正在使用Firebase云函数进行DialogFlow项目。 我向API发送GET请求,从服务器接收回数据,然后将其显示在fulfillment text属性上。那很好

现在我需要将来自服务器的cookie会话id存储在一种“应用程序变量”中,以便跟踪客户端和服务器之间的交互。 我试图将cookie会话保存在上下文对象中,这样做会出现以下错误:

Agent.getContext不是IncomingMessage.resp上的函数

代码如下:

exports.dialogflowFirebaseFulfillment = functions.https.onRequest( ( req, resp ) =>{

  const agent = new WebhookClient( {request: req, response: resp} );

  //SET CONTEXT HERE

  const context = {
    'name': 'sessione',
    'lifespan': 2,
    'parameters': {'idSessione': c.sessionID}
  };
  agent.setContext( context );

  if( context ){
    console.log( '*--*****************--  name context =' + context.name );
  }

  //...some stuff etc-

  //call my function to consume API

  callAVA( strRicerca ).then( ( strOutput ) =>{

    return resp.json( {'fulfillmentText': strOutput} );
  } ).catch( ( error ) =>{

    return resp.json( {'fulfillmentText': 'error error'} );

  } );
} );

// added parameter Agent-
function callAVA( agent, strRicerca ){
  return new Promise( ( resolve, reject ) =>{

    https.get( options, ( resp ) =>{

      //variable options contains set cookies values , host name etc-

      let data = '';

      // A chunk of data has been recieved.
      resp.on( 'data', ( chunk ) =>{
        data += chunk;

      } );

      // The whole response has been received. Print out the result.
      resp.on( 'end', () =>{

        let c = JSON.parse( data );

        let strOutput = c.output[0].output;
        console.log( '----- ID DELLA SESSIONE : ' + c.sessionID );
        if( c.sessionID ){

          // I NEED TO SAVE IDSESSION FROM SERVER -

          let context = agent.getContext( 'sessione' );

          //  GOT  ERROR: agent.getContext is not a function at IncomingMessage.resp (????)


          context.parameters.idSessione = c.sessionID;
        }


        resolve( strOutput );

        //DO OTHER STUFF...
      } );

      resp.on( "error", ( err ) =>{
        console.log( "Error: " + err.message );

        reject( err.message );
      } );

    } );
  } );
}
有没有其他方法可以跟踪向服务器发送请求的用户?我更愿意在不访问数据库的情况下保持简单……非常感谢,任何帮助都将不胜感激。:)

__________________________________编辑________________________________ 把上下文放在一边,我意识到我遗漏了一些要点,所以 根据您的建议,我对代码进行了如下修改:

const functions = require('firebase-functions');
const querystring = require('querystring');
const {WebhookClient} = require('dialogflow-fulfillment');
const https = require('http');


postData = querystring.stringify({
    'searchText': 'ciao',
    'user':'',
    'pwd':'',
    'ava':'FarmaInfoBot'

  });
   const options = {
    hostname: '86.107.98.69', 
    port: 8080, 
    path: ‘/mypath/search_2?searchText=', 
    method: 'POST', 
    headers: {
      'Content-Type': 'application/json', 
      'Content-Length': Buffer.byteLength(postData),
      'Cookie':'JSESSIONID=' // -> this comes from the server, store it in context, conv.data or what else-> to do
    }
  };

 exports.dialogflowFirebaseFulfillment = functions.https.onRequest((req, resp) => {

   const agent = new WebhookClient({ request: req, response: resp});

    let strRicerca='';
    if (req.body.queryResult.parameters['searchText']) {
      strRicerca=req.body.queryResult.parameters['searchText'];

        options.path+=strRicerca+'&user=&pwd=&ava=FarmaInfoBot';
    }

    /* IS THIS OK NOW TO INVOKE FUNCTION LIKE THIS, NOW THAT I ADDED AGENT ? */
   callAVA(agent, strRicerca).then((strOutput)=> {

        return resp.json({ 'fulfillmentText': strOutput }); 
    }).catch((error) => {

       return resp.json({ 'fulfillmentText': 'error!!!!!!!!!!'});

    });



function callAVA(agent, strRicerca) {
  return  new Promise((resolve, reject) => {


     https.get(options, (resp) => {


        let data = '';
        console.log(`STATUS RESPONSE: ${resp.statusCode}`);
        console.log(`HEADERS RESPONSE: ${JSON.stringify(resp.headers)}`);

        resp.on('data', (chunk) => {
            console.log(`BODY: ${chunk}`);
            var c=JSON.parse(chunk);

        });
        resp.on('end', () => {


            let c=JSON.parse(data);

            let strOutput= agent.add('Static response from Agent'); // c.output[0].output;

            console.log(strOutput);


            resolve(strOutput);  


        });
         resp.on("error", (err) => {
            console.log("Error: " + err.message);

            reject(err.message);
      });
     });

  });

}

let intentMap = new Map();
intentMap.set('test_fb', callAVA);
agent.handleRequest(intentMap);
});
现在程序正在运行,但我收到一个空响应,崩溃发生在end事件中,解析Json数据。
最后,我的目标是找到一种方法,将来自服务器的cookie保存在一个全局变量中,并在整个会话中保持它

这里似乎有一些问题

如果错误的直接原因是您将
callAVA()
函数定义为

function callAVA( agent, strRicerca )
但是当您在前面几行调用它时,您忽略了
agent
参数:

callAVA( strRicerca )
然而,你如何使用它还有其他问题,从长远来看会给你带来问题

虽然您所做的可能是有效的,也可能是有效的,但它也不同于处理通常的工作方式,并且可能是您造成了一些问题

通常,您可以创建
代理
,然后针对它注册意图处理程序。差不多

let intentMap = new Map();
intentMap.set('intent.name.1', intentHandlerFunction1);
intentMap.set('intent.name.2', intentHandlerFunction2);
agent.handleRequest(intentMap);
它将使用单个参数调用意图名称的匹配函数,
代理
。(顺便说一句——回报承诺做得很好!这部分你说对了。)

作为意图处理程序的一部分,您需要在承诺完成之前调用
agent.setContext(context)
。在以后的意图处理程序中,当您想知道该值时,需要调用
agent.getContext('context-name')
,该函数应返回整个上下文对象,包括剩余寿命和它的参数

更新

您在第一次编辑中所做的更改是不够的。问题是您混合了两种不同的方法来调用意图处理程序:

  • 一方面,您直接使用第二个参数调用它。作为结果的一部分,它将JSON发送到
    resp
    对象

  • 另一方面,您已经在
    intentMap.set()
    中注册了它,当调用
    handleRequest()
    并且它通过
    agent
    对象设置响应时,这会导致调用它(仅使用
    agent
    参数)

  • 通常,除非您希望自己操作所有JSON,否则您应该依赖方法(2)。您不应该自己直接调用Intent Handler函数,而是让
    handleRequest()
    为您处理它


    因为您需要stricerca对象,所以可以在函数运行的同一范围内使用它,它似乎已经存在。因此,您可能不需要将其作为一个参数。

    谢谢@Cairman的回答,您能检查一下我的答案吗?很抱歉给您带来不便,现在我刚刚编辑了我的原始问题@Cairman,方法2现在可以了,我只传递了一个参数,web钩子引用,即代理。只是一个疑问:从函数callAVA返回代理可以吗?我的意思是:agent.add(strOutput);决议(代理人);说得清楚一点,你不会把特工还给我的。你在回报一个承诺,而这个承诺就是解决一个代理。也就是说,是的,向代理人作出决定是可以的。重要的一点是,你在回报承诺。很高兴它起作用了!