node.js - Lambda 总是返回 200
问题描述
当我为我的 Lambda 函数提供 GetItem 调用的无效主键时,它似乎会搜索该键直到超时,但它仍然只返回 200(没有响应正文)。
有什么方法可以确保函数在遍历表一次而没有找到键并返回错误消息后中止?让它一遍又一遍地查看直到超时似乎是在浪费功能时间?此外,它在 1000 毫秒后超时,这不是我的函数超时设置,这让我认为这里除了常规超时之外还有其他事情发生。
代码:
'use strict';
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = (event, context, callback) => {
const done = (err, res) => {
const response = {
statusCode: err ? '400' : '200',
body: err ? JSON.stringify(err) : JSON.stringify(res)
}
callback(null, response);
};
const groupId = event.pathParameters.groupId;
const eventId = event.pathParameters.eventId;
docClient.get({
TableName: 'events',
Key: {
groupId,
eventId
}
},
(err, data) => {
done(err, data.Item);
});
};
解决方案
在一个完美的世界中,我希望该函数在它“意识到”我提供了一个不正确的主键后停止,然后返回一些错误,告诉客户端它在表中找不到具有该主键的项目关键,对!
这只有在我们让数据库操作完成时才会发生!所以我们必须依赖数据库的响应。
这是我们可以做的:根据响应返回错误,无论是 200 还是 400!
检查Lodash的resdone function
isEmpty 方法并使用您的.
'use strict';
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
const { isEmpty } = require('lodash');
exports.handler = (event, context, callback) => {
const done = (err, res) => {
const response = {
statusCode: (err || isEmpty(res)) ? '400' : '200',
body: err ? JSON.stringify(err) : JSON.stringify(res)
}
callback(null, response);
};
const groupId = event.pathParameters.groupId;
const eventId = event.pathParameters.eventId;
docClient.get({
TableName: 'events',
Key: {
groupId,
eventId
}
},
(err, data) => {
done(err, data.Item);
});
};
希望这能解决您的疑问!
推荐阅读
- c - strcat 和返回错误的差异
- java - 在 jersey 异步客户端中,如何等待所有调用完成然后执行一些代码
- python - 如何将选定的值从一种形式传递到另一种形式而不存储
- reactjs - .next 文件夹在生产模式下在 CentOS 上使用 Docker 缺少一些文件
- c++ - 创建字符串的可变参数模板函数
- istio - 用于内部 kube 服务的 ISTIO 服务网格
- c++ - in_avail() 在 sgetn(..,..) 调用后未返回正确的可用字节数
- reactjs - 反应中购物车应用程序中的项目ID问题
- css - '@media' 在 CSS 上无法正常工作以进行响应式设计
- java - spring-boot-starter-parent 的不可解析 POM