代码之家  ›  专栏  ›  技术社区  ›  Jul10

同步性不好导致空字符串响应

  •  -1
  • Jul10  · 技术社区  · 6 年前

    我启动了一个简单的代理,并添加了一个名为 我的意图 “为了它。我通过Firebase内联编辑器启用了fulfillment,并在下面的指令中添加了一个名为“ 我的功能 “到提供的基地。此函数包含对的示例HTTPS GET请求 https://reqres.in/api/users/2 .
    我的目标是根据对外部API的GET调用提供的响应为我的意图添加响应。

    剧本

    'use strict';
    
    const functions = require('firebase-functions');
    const {WebhookClient} = require('dialogflow-fulfillment');
    const {Card, Suggestion} = require('dialogflow-fulfillment');
    const https=require('https');
    
    process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements
    
    exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
      const agent = new WebhookClient({ request, response });
      console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
      console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
    
    function myFunction(agent){
    
        var info='';
        var options = {
             host: `reqres.in`,
             path: `/api/users/2`,
             method: 'GET',
             headers: {'Accept':'application/json'}
        };
    
        var req = https.request(options, (res) => {
             console.log('statusCode:', res.statusCode);
             console.log('headers:', res.headers);
    
             let data='';
    
             res.on('data', (d) => {
               data+= d;
             });
    
             res.on('end', () => {
               console.log(data);
               let jsonObject= JSON.parse(data);
               info=jsonObject.id;
    
               console.log(JSON.stringify(info));
             });
        });
    
        req.on('error', (e) => {
           console.log('ERROR');
           console.error(e);
        });
    
        agent.add(JSON.stringify(info));
        req.write('End of request');
        req.end();  
    
    
    }
    
    
    
        let intentMap = new Map();
        intentMap.set('myIntent',myFunction);
        agent.handleRequest(intentMap);
        });
    

    意图被正确触发,但我的问题是代理响应始终是空字符串。
    enter image description here

    我对http调用和函数回调没有太多经验,但我认为问题在于

     agent.add(info);
    

    在我的脚本结束时,在http调用结束之前执行。
    我试着在里面插入一个承诺 myFunction 下列的 https://www.promisejs.org/ ,但它们都只携带错误消息。
    我们会感谢你的帮助,我理解这个问题,但我无法解决它。

    附笔: agent.handleRequest docs reference

    我用承诺的失败尝试

    'use strict';
    
    const functions = require('firebase-functions');
    const {WebhookClient} = require('dialogflow-fulfillment');
    const {Card, Suggestion} = require('dialogflow-fulfillment');
    const https=require('https');
    
    process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements
    
    exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
      const agent = new WebhookClient({ request, response });
      console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
      console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
    
    
     function myFunction(agent){
        var info='';
        var p=new Promise((resolve,reject)=>{
    
            var options = {
            host: `reqres.in`,
            path: `/api/users/2`,
            method: 'GET',
            headers: {'Accept':'application/json'}
            };
    
            var req = https.request(options, (res) => {
                console.log('statusCode:', res.statusCode);
                console.log('headers:', res.headers);
                let data='';
    
            res.on('data', (d) => {
                data+= d;
            });
    
            res.on('end', () => {
                console.log(data);
                let jsonObject= JSON.parse(data);
                info=jsonObject.id;
    
                 console.log(JSON.stringify(info));
                });
            });
    
            req.on('error', (e) => {
                console.log('ERROR');
                console.error(e);
            });
    
            req.write('End of request');
            req.end();
            resolve(info);
        });
    
        p.then((agent)=>{
            agent.add(info);
        });
    
        }
    let intentMap = new Map();
      intentMap.set('myIntent',myFunction);
      agent.handleRequest(intentMap);
    });
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Bergi    6 年前

    你还在 立即 和…一起做事 info -现在解决承诺-而不是通过异步回调来实现。把 agent.add() 呼叫或 resolve() 呼叫 end 处理程序,以便它只在数据完成后发生:

    var p = new Promise((resolve,reject) => {
        var options = {
            host: `reqres.in`,
            path: `/api/users/2`,
            method: 'GET',
            headers: {'Accept':'application/json'}
        };
    
        var req = https.request(options, (res) => {
            console.log('statusCode:', res.statusCode);
            console.log('headers:', res.headers);
            let data='';
    
            res.on('data', (d) => {
                data+= d;
            });
    
            res.on('end', () => {
                console.log(data);
                let jsonObject = JSON.parse(data);
                resolve(jsonObject.id);
    //          ^^^^^^^^^^^^^^^^^^^^^^^
            });
        });
    
        req.on('error', (e) => {
            reject(e); // don't forget this
        });
    
        req.write('End of request');
        req.end();
    });
    
    p.then(info => {
    //     ^^^^ the fulfillment value that you passed to resolve()
        agent.add(info);
    }, err => {
        console.log('ERROR');
        console.error(err);
    });