Ababwa
Ababwa

Reputation: 141

Use Dynasty DynamoDB Query in Alexa Response

I am using Dynasty in my Nodejs Alexa Skill Service, run on AWS Lambda, to query DynamoDB. Due to the structure of the API, I am unable to use a query's result in my Alexa response. In the code below, the callback passed to 'then' is run after the handler returns, so 'name' is never assigned. How can I use information obtained in the query callback in my response?

const dynasty = require('dynasty')(credentials);

const myIntentHandler = {
    canHandle(input) {
        return input.requestEnvelope.request.intent.name === 'MyIntent';
    },
    handle(input) {
        const userId = input.requestEnvelope.session.user.userId;
        const users = dynasty.table('user');
        var name;
        users.find(userId).then(function(user) {
            if(user) {
                name = user.name;
            } else {
                ...
            }
        });
        return input.responseBuilder.speak('Hello ' + name).getResponse();
    }
};

Upvotes: 1

Views: 246

Answers (1)

Mike Dinescu
Mike Dinescu

Reputation: 55750

The Alexa SDK for NodeJS v2 supports promises in handlers.

So, from you handler you return a promise, chained off of the Dynasty query promise.

const dynasty = require('dynasty')(credentials);

const myIntentHandler = {
    canHandle(input) {
        return input.requestEnvelope.request.intent.name === 'MyIntent';
    },
    handle(input) {
        const userId = input.requestEnvelope.session.user.userId;
        const users = dynasty.table('user');
        var name;
        return new Promise((resolve, reject) => {
            users.find(userId).then(function(user) {
                if(user) {
                    name = user.name;
                    let response 
                        = input.responseBuilder
                               .speak('Hello ' + name)
                               .getResponse();
                    resolve(response);
                } else {
                    ...
                    // handle this case
                    //  and resolve(..) or reject(..)
                }
            });
        });
    }
};

Upvotes: 2

Related Questions