node.js - 必须多次测试 lambda 才能工作
问题描述
我有一个正在使用的 lambda 函数。它将非常基本的信息插入到 DynamoDB 表中。这是代码:
'use strict';
const alexaSkillKit = require('alexa-skill-kit');
const AWS = require('aws-sdk');
function binDaySkill(event, context, callback) {
alexaSkillKit(event, context, (message) => {
let params = {
Item: {
user_id: '123',
some_data: 'some data here'
},
TableName: 'my_table'
};
let documentClient = new AWS.DynamoDB.DocumentClient();
documentClient.put(params, function (err, data) {
if (err) {
callback("Error", err);
} else {
callback(null, data);
}
});
});
}
我遇到的问题是它有时只会将数据保存在数据库中。在它做任何事情之前,我必须点击测试 5-10 次。
任何人都可以帮助解决可能导致这种情况的原因吗?
解决方案
发生这种情况的原因是因为alexa-skill-kit
会为您处理回调。
请参阅文档。通过传入context
对象,您允许包装处理程序 ( alexaSkillKit(...)
) 管理返回的对象和有效负载的解码和编码。处理程序alexSkillKit
回调函数只希望您返回一个值。
对于您的代码示例,您可以执行以下操作:
'use strict';
const alexaSkillKit = require('alexa-skill-kit');
const AWS = require('aws-sdk');
function binDaySkill(event, context, callback) {
alexaSkillKit(event, context, (message) => {
let params = {
Item: {
user_id: '123',
some_data: 'some data here'
},
TableName: 'my_table'
};
let documentClient = new AWS.DynamoDB.DocumentClient();
return documentClient.put(params).promise()
.then((data) => {
// stuff with the data!
return data;
}).catch((err) => {
// stuff with the error
throw err;
});
});
}
nb 在几次调用后它起作用的原因是 lambda 重用了每次调用执行的环境。它通过有效地“冻结”环境的状态并在再次需要它时解冻它来做到这一点。这是人们进行许多优化的基础;这意味着你有时会解冻一个在回调过程中途被 alexaSkillKit 首先返回时冻结的环境。
推荐阅读
- python - http:client 和 Requests 的区别
- sql-server - MS SQL Server 从 sys.sql_dependencies 获取引用对象的 db_name()
- security - 保护网站内容免受虚假注册
- python - GCE 如何在谷歌 TPU 中使用 ImageDataGenerator
- reactjs - React & Redux : cannot read property of undefined
- sql - AWS Redshift SQL 使用查询结果执行另一个查询
- c# - 是否可以使用 DataTrigger 设置组合框的 SourceItem?
- java - Kotlin 与 android java 在 Dalvik VM 上的工作
- python - 与熊猫的“枢轴”操作完全相反
- sql - 从另一个表更新一个表做一些数学