在 Alexa 响应中使用 Dynasty DynamoDB 查询

Use Dynasty DynamoDB Query in Alexa Response

我在我的 Nodejs Alexa 技能服务中使用 Dynasty,在 AWS Lambda 上使用 运行 来查询 DynamoDB。由于 API 的结构,我无法在我的 Alexa 响应中使用查询结果。在下面的代码中,传递给 'then' 的回调是在处理程序 returns 之后的 运行,因此永远不会分配 'name'。如何在我的响应中使用在查询回调中获得的信息?

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

用于 NodeJS v2 的 Alexa SDK 支持 promises in handlers

所以,从你的处理程序你 return 一个承诺,与 Dynasty 查询承诺链接。

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