简体   繁体   中英

Running Async functions in Microsoft Bot Builder (with Node.JS)

I'm trying to make a test bot that, upon being chatted to responds with a (meaningless) string gotten from a JSON object through another API

Code:

var restify = require('restify');
var builder = require('botbuilder');
var request = require('request-promise');

// Setup Restify Server
var server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function () {
   console.log('%s listening to %s', server.name, server.url); 
});

// Create chat connector for communicating with the Bot Framework Service
var connector = new builder.ChatConnector({
    appId: process.env.MicrosoftAppId,
    appPassword: process.env.MicrosoftAppPassword
});

// Listen for messages from users 
server.post('/api/messages', connector.listen());

// Receive messages from the user and respond by echoing each message back (prefixed with 'You said:')
var bot = new builder.UniversalBot(connector, function (session) {
    var text = await MyRequest()
    session.send("%s", text);
});

async function MyRequest() {
    var options = {
        uri: "https://jsonplaceholder.typicode.com/posts/1",
        method: "GET",
        json: true
    }

    try {
        var result = await request(options);
        return result;
    } catch (err) {
        console.error(err);
    }
}

The problem is the bot var isn't an asynch function, so I can't put await in it. If I remove await, the bot replies with Object Promise. I'm fairly inexperienced in JS overall, so can I get any pointers?

e: The Request part works great, I've tested it alone in a different js program

Have you tried this. If you are using ES6 compatible Node environment this should work

var bot = new builder.UniversalBot(connector, async function (session) {
    // Use JSON.stringify() if MyRequest Promise will resolve a object
    var text = await MyRequest()
    session.send("%s", text);
});

If async/await isn't possible, how about returning a promise? like below:

function MyRequest() {
    var options = {
        uri: "https://jsonplaceholder.typicode.com/posts/1",
        method: "GET",
        json: true
    }
    return request(options);
}

And use Promise.then to act on the result, like so:

var bot = new builder.UniversalBot(connector, function (session) {
    MyRequest().then(function(text) {
        session.send("%s", text);
    }).catch(function(error) {
        session.send("%s", error);
    });
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM