首页 > 解决方案 > 必须多次测试 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 次。

任何人都可以帮助解决可能导致这种情况的原因吗?

标签: node.jsaws-lambdaamazon-dynamodb

解决方案


发生这种情况的原因是因为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 首先返回时冻结的环境。


推荐阅读