v4 Bot sendActivity在Bot中没有输出[object Promise]

时间:2019-03-09 00:04:58

标签: botframework

我的在线聊天Bot内部没有输出

await turnContext.sendActivity('No output in Bot? '+this.translateText(turnContext.activity.text));

没有错误消息,并且在日志中我从Microsoft Cognitive Text Translator API服务获得了正确的JSON。但是在Bot Framework仿真器中,我只能得到[object Promise]?

const request = require('request');
const uuidv4 = require('uuid/v4');
const rp = require('request-promise');
class EchoBot {
    constructor(conversationState) {
        this.conversationState = conversationState;
    }
    async onTurn(turnContext) {
        if (turnContext.activity.type === ActivityTypes.Message) {
            // OK
            await turnContext.sendActivity(`${ count }: Alex you said "${ turnContext.activity.text }"`);

            // not output in Bot?
            await turnContext.sendActivity('No output in Bot? '+this.translateText(turnContext.activity.text));
        } else {
            await turnContext.sendActivity(`[${ turnContext.activity.type } event detected]`);
        }
        await this.conversationState.saveChanges(turnContext);
    }
    async translateText(inputText){
        let options = {
            method: 'POST',
            baseUrl: 'https://api.cognitive.microsofttranslator.com/',
            url: 'translate',
            qs: {
            'api-version': '3.0',
            'to': 'de'
            },
            headers: {
            'Ocp-Apim-Subscription-Key': subscriptionKey,
            'Content-type': 'application/json',
            'X-ClientTraceId': uuidv4().toString()
            },
            body: [{
                'text': inputText
            }],
            json: true,
        };
        rp(options)
        .then(function (repos) {
            console.log(JSON.stringify(repos, null, 4));
            return JSON.stringify(repos, null, 4);
         })
        .catch(function (err) {
            console.log("error alex");
        });
    }; 
}

1 个答案:

答案 0 :(得分:0)

由于您使用的是响应承诺包,因此建议您使用async / await而不是then / catch方法。异步/等待方法与BotFramework的流程更加内联,将使您可以将请求中的结果承诺返回给onTurn方法。 translateText函数应如下所示:

async translateText(inputText){
    let options = {
        method: 'POST',
        baseUrl: 'https://api.cognitive.microsofttranslator.com/',
        url: 'translate',
        qs: {
        'api-version': '3.0',
        'to': 'de'
        },
        headers: {
        'Ocp-Apim-Subscription-Key': subscriptionKey,
        'Content-type': 'application/json',
        'X-ClientTraceId': uuidv4().toString()
        },
        body: [{
            'text': inputText
        }],
        json: true,
    };

    const repos = await rp(options);
    return repos[0].translations[0].text;

}; 

请注意,由于translateText是异步方法,并且返回了一个Promise,因此您必须在函数调用之前添加await。

await turnContext.sendActivity('No output in Bot? ' + await this.translateText(turnContext.activity.text));

Screenshot

希望这会有所帮助!