【问题标题】:Return Promise from DynamoDB before Alexa output在 Alexa 输出之前从 DynamoDB 返回 Promise
【发布时间】:2018-10-09 17:17:52
【问题描述】:

建立需要坚持不懈的 Alexa 技能。

我正在调用数据库以在管理流程之前获取用户详细信息,并且我正在努力让 Node 等待来自 DynamoDB 的响应(使用 Dynasty.js 处理数据库连接)。

我尝试了一大堆不同的承诺/回调/节点“阻塞”/异步方法,我能做的最好的就是在用户退出技能时显示响应(在 CloudWatch 日志中)。我真的希望用户配置发生在流程开始时,而不是结束时!

var credentials = {
    accessKeyId: process.env.MY_ACCESS_KEY_ID,
    secretAccessKey: process.env.MY_SECRET_ACCESS_KEY
};

var dynasty = require('dynasty')(credentials);
var tableName = dynasty.table('dynamoTable');

const promiseFunc = new Promise((resolve,reject)=>{
  var myUser = tableName.find(userId);
  setTimeout(_=>{resolve(myUser)}, 2000);
});

var checkUser = async function(){
	if (true) {
		console.log('check, check, 1, 2, 3');
		await promiseFunc.then(function(myUser) {
			if (myUser) {
				console.log("USER FOUND");
				console.log(myUser);
			} else {
				console.log("no user! sigh deeply and start again");
			}
		})
	}
	console.log("do more stuff now");
}

exports.handler = function(event, context) {	
	
  userId = event.session.user.userId;
	const alexa = Alexa.handler(event, context);
	
  // only check the first time, and only once the userId is properly constructed
	if (!(userId.startsWith('amzn1.ask.account.testUser')) && (checkedUser != 1)) {
		checkedUser = 1;
		checkUser();
	}
	
	alexa.resources = languageString;
	alexa.registerHandlers(newSessionHandlers, startStateHandlers, triviaStateHandlers, helpStateHandlers, stopStateHandlers);
	alexa.execute();
};

如何让节点在脚本的其余部分运行之前等待来自 dynamoDB 的响应...

【问题讨论】:

    标签: node.js promise amazon-dynamodb alexa dynastyjs


    【解决方案1】:

    这是一个老式的链接,但是according to it,您可以使用.promise() 方法从 DynamoDB 获得承诺。考虑到这一点...

    function findUser(userId) {
        // initialize tableName somehow
        return tableName.find(userId)
    }
    
    async function checkUser() {
        // initialize userId somehow
       let myUser = await findUser(userId);
       console.log(`found user ${myUser}`);
       return myUser;
    }
    

    最后,记得等待你对 checkUser() 的调用...

    if (/* long condition */) {
        checkedUser = 1;
        let myUser = await checkUser();
    }
    

    【讨论】:

    • Dynasty.js 有自己的承诺钩子 - link - 但无论是这个还是上面的方法,似乎都不起作用。感谢您花时间查看。米
    • @midtempo - 对承诺文章的介绍似乎表明 find() 返回了一个承诺。这意味着您可以在我的回答中省略.promise()(经过编辑以显示)。如果这不起作用,也许你应该建立一个最小的例子(就像我的回答)。用硬编码的参数在数据库中找到你知道的东西并记录它。从那里开始工作。
    • @midtempo - 还顺便注意到您未能等待对异步函数的调用。
    猜你喜欢
    • 2019-10-14
    • 1970-01-01
    • 2018-10-19
    • 2019-05-28
    • 2020-12-02
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多