我想知道有没有人能帮我排除Node lambda的故障.我有一个带有USER和ACCESS_COUNT键的DDB,但当我使用错误的键参数调用getCommand时,lambda允许它,并成功测试&结果为空.有人知道我错过了什么吗?


// Instrument the AWS SDK client
const client = tracer.captureAWSv3Client(new DynamoDBClient());

//const client = new DynamoDBClient({});
const dynamodb = DynamoDBDocumentClient.from(client);
const table_name = process.env.TABLE_NAME;

const lambdaHandler = async (event, context) => {
    let body;
    let statusCode = 200;
    
    const user = event.user;
    let visit_count = 0;
    
    try {
        const params = {
            TableName: table_name,
            Key: {
                user: user
            }
        };
        
        body = await dynamodb.send(new GetCommand(params));
        if (body.Item) {
            visit_count = body.Item.visit_count;
        }
        visit_count++;
        
        const putParams = {
            TableName: table_name,
            Item: {
                user: user,
                visit_count: visit_count
            }
        };

        body = await dynamodb.send(new PutCommand(putParams));
    
        const message = `Hello ${user}! You have visited us ${visit_count} times.`;
        console.log(message);
        return {
            message: message
        };
    
    }catch (err) {
        statusCode = 400;
        body = err.message;
    } finally {
        body = JSON.stringify(body);
    }
};

推荐答案

如果try块内发生异常,您的lambda将只是catch部分的快捷方式.

对DynamoDB表或索引的其他有效的GetItem请求不会导致匹配,也不会导致HTTP错误.它将返回200状态,其中包含响应的有效(尽管为空)JSON对象(模数补充数据).

docs人开始:

GetItem操作返回具有给定主键的项的一组属性.如果没有匹配项,GetItem不会返回任何数据,响应中也不会有Item元素.

来自DynamoDB的200响应不会拒绝dynamodb.send返回的promise ,等待它也不会触发异常.

如果不匹配对于您的逻辑来说是异常情况,如果没有返回Item,您应该判断响应并手动抛出异常:

if (!body.Item) {
  throw new Error("User not found"); // or similar
}

请注意,即使发生异常,Lambda(运行时)也无法知道这一点.您有一个全局的Try…Catch块,它有效地接受了所有错误.您正在为局部变量statusbody赋值,但没有返回它们或对它们做任何有意义的事情.

如果您想告诉Lambda您的函数失败了,那么您需要拒绝您的处理程序返回的promise .要做到这一点,最简单的方法是完全删除Try…Catch块,在发生无法恢复的事情时抛出异常,然后顺其自然.

如果您使用Lambda作为API Gateway的代理集成,则变量statusbody(显然是从互联网上的某个示例盲目复制粘贴的)将仅转换为HTTP状态代码和HTTP响应.实际上,您必须从您的处理程序返回它们,才能使其正常工作.即使您这样做了,并且状态将是4**或5**值,从Lambda的Angular 来看,它仍将被视为成功.

Node.js相关问答推荐

聚合发布/订阅消息

FindOne()返回所有值,而不是一个值

获取页面大小为10的所有文章,每篇文章填充一些所需的用户信息

AWS-ROUTE 53指向S3存储桶,错误是别名目标名称不在目标区域内

无法通过 NextJS 访问 HTTP 帖子中的正文

将 null 推入管道后,node.js 可写完成未发出

在 Header 中使用 Authorization 方法和新的附加参数:accessToken 有什么区别?

fastify:流过早关闭

Express.js - 监听请求中止

如何使用 Jest 模拟异步函数的延迟时间

一个非常奇怪的JavaScript heap out of memory问题

Discord.js V14 interaction.editReply 给出了一个无效的 webhook 令牌错误

在 `DataFrame` 上使用用户定义的可链接函数抽象出 Polars 表达式

tsc:当我上传 React+next js 和 node 项目时,在 heroku 找不到

users.watch(在 gmail google api 中)如何收听通知?

添加git信息到create-react-app

如何使用 gulp-uglify 缩小 ES6 函数?

从 React(同构应用程序)进行 API 调用时出现Access-Control-Allow-Origin问题

我无法全局安装 nodemon,nodemon无法识别

将 expressjs 绑定到特定的 IP 地址