>

Firebase Cloud 기능을 사용하여 DialogFlow 프로젝트를 진행 중입니다. API에 GET 요청을 보내고 서버에서 데이터를 수신 한 후 이행 텍스트 특성에 표시합니다. 괜찮습니다.

이제 클라이언트와 서버 간의 상호 작용을 추적하기 위해 서버의 쿠키 세션 ID를 일종의 "애플리케이션 변수"에 저장해야합니다. 쿠키 세션을 컨텍스트 객체에 저장하려고하면 오류가 발생합니다.

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);
});

이제 프로그램이 실행 중이지만 빈 응답을 받으면 종료 이벤트에서 충돌이 발생하여 Json 데이터를 구문 분석합니다. 마지막으로 목표는 서버의 쿠키를 전역 변수로 저장하고 대화를 통해 쿠키를 유지하는 방법을 찾는 것입니다.

  • 답변 # 1

    여기에 몇 가지 문제가있는 것 같습니다.

    오류가 callAVA() 를 정의한 경우의 직접적인 원인  기능으로

    function callAVA( agent, strRicerca )
    
    

    그러나 몇 줄 더 일찍 호출하면 agent 가 생략됩니다.  매개 변수 :

    callAVA( strRicerca )
    
    

    그러나 사용법에있어 다른 문제가있어 장기적으로 문제를 일으킬 수 있습니다.

    하고있는 일이 유효하고 효과가있을 수 있지만, 처리가 일반적으로 작동하는 방식과 다르며, 이로 인해 문제가 발생할 수 있습니다.

    일반적으로, 당신은 agent 를 만듭니다 ,있는 그대로 의도 처리기를 등록하십시오. 와 같은 것

    let intentMap = new Map();
    intentMap.set('intent.name.1', intentHandlerFunction1);
    intentMap.set('intent.name.2', intentHandlerFunction2);
    agent.handleRequest(intentMap);
    
    
    단일 매개 변수 agent 를 사용하여 의도 이름에 대한 일치 함수를 호출합니다. . (제쳐두고-약속을 반환하는 좋은 직업! 당신은 그 부분이 맞습니다.)

    인 텐트 핸들러의 일부로 agent.setContext(context) 를 호출하고 싶을 것입니다  약속이전에완료됩니다. 이후의 인 텐트 핸들러에서는 값을 알고 싶을 때 agent.getContext('context-name') 를 호출해야합니다.  남은 수명과 매개 변수를 포함하여 전체 Context 객체를 반환해야합니다 ..

    업데이트

    첫 번째 편집에서 변경 한 것만으로는 충분하지 않습니다. 문제는 인 텐트 핸들러를 호출하는 두 가지 방법을 혼합한다는 것입니다.

    <올>

    한 가지 방법으로 두 번째 매개 변수를 사용하여 직접 호출합니다. 결과의 일부로 JSON을 resp 에 보냅니다.  개체.

    다른 방법으로, intentMap.set() 에 등록했습니다  그것은 agent 와 함께 호출되도록합니다.  매개 변수) handleRequest()  호출되고 agent 를 통해 응답을 설정합니다.  개체.

    일반적으로 모든 JSON을 직접 조작하지 않으려면 방법 (2)를 사용해야합니다. 의도 처리기 함수를 직접호출하지 말고 대신 handleRequest()  당신을 위해 그것을 처리하십시오.

    strRicerca 가 필요하기 때문에  객체를 사용하면 함수가 실행되는 것과 동일한 범위에서 사용할 수 있습니다. 따라서 매개 변수로 포함하지 않아도됩니다.

  • 이전 vba - 오류 이동시 - 오류 메시지 가져 오기 -2147024809
  • 다음 html - mysql에서 가져온 값 선택