AWS Lambda 查询二级索引
AWS Lambda querying secondary index
以下是 AWS lambda 中对 dynamoDB JSON 对象的 node.js 查询。
UserID 是没有排序键的主键。
GeoHash 是辅助键,索引名称为 "GeoHash-index"。
调用成功且没有错误,但不会返回任何内容。下面的测试数据可能是错误的,因为它没有提供与索引名称的任何联系,但我是 AWS/noSQL 的新手并且有点迷路。
var AWS = require('aws-sdk');
var docClient = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = function(event,context,callback) {
console.log(JSON.stringify(event, null, ' '));
var tableName = "table1";
// getItem
docClient.getItem({
TableName: tableName,
IndexName: "GeoHash-index",
KeyConditionExpression: "GeoHash = :geohash",
ExpressionAttributeValues: {":geohash": "dpz886gb0tb0"}
}),
function(err,data){
if(err){
callback(err);
} else {
callback(null,data);
}
}
};
lambda测试数据在哪里
{
"GeoHash": "dpz886gb0tb0",
"Radius": 2,
"Timestamp": 1472601493180,
"UserID": "User1"
}
GeoHash 字符串应该相互匹配。想法?
编辑
这种方法也没有成功
var AWS = require('aws-sdk');
var docClient = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = function index(event, context, callback) {
var params = {
TableName: "LocationAware1",
IndexName: "GeoHash-index",
KeyConditionExpression: "GeoHash = :geohash",
ExpressionAttributeValues: {
":geohash": {'S': 'dpz886gb0tb0'}
},
};
docClient.query(params, function(err, data) {
if (err)
console.log(JSON.stringify(err));
else
console.log(JSON.stringify(data));
});
}
当你说调用成功且没有错误时,我假设你的意思是调用 lambda
如果您使用的是节点版本 4.3,那么从 aws lambda 文档的摘录中可以看出,您从函数中 return 的方式已被弃用
The Node.js runtime v4.3 supports the optional callback parameter. You >can use it to explicitly return information back to the caller. The general syntax is:
callback(Error error, Object result);
使用回调参数是可选的。如果您不使用可选的回调参数,则行为与调用不带任何参数的回调() 相同。您可以在您的代码中指定回调以向调用方提供 return 信息。
如果您不在代码中使用回调,AWS Lambda 将隐式调用它并且 return 值为 null。
This is the correct way to return from an aws lambda function if using node version 4.3
首先像这样向处理函数添加第三个参数
exports.handler = function(event,context,callback)
那么当 return 从函数中调用时遵循这种形式
function(err,data){
if(err){
callback(err);
} else {
callback(null,data);
}
}
var AWS = require('aws-sdk');
exports.handler = function(event,context,callback) {
var params = {
TableName: 'Table1',
IndexName: 'GeoHash-index',
KeyConditionExpression: 'GeoHash = :geohash',
ExpressionAttributeValues: {
':geohash': 'dpz886g8p9e2',
}
};
var docClient = new AWS.DynamoDB.DocumentClient();
docClient.query(params, function(err, data) {
if (err) callback(err);
else callback(null, data);
});
}
重写了,很干净。
以下是 AWS lambda 中对 dynamoDB JSON 对象的 node.js 查询。 UserID 是没有排序键的主键。 GeoHash 是辅助键,索引名称为 "GeoHash-index"。 调用成功且没有错误,但不会返回任何内容。下面的测试数据可能是错误的,因为它没有提供与索引名称的任何联系,但我是 AWS/noSQL 的新手并且有点迷路。
var AWS = require('aws-sdk');
var docClient = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = function(event,context,callback) {
console.log(JSON.stringify(event, null, ' '));
var tableName = "table1";
// getItem
docClient.getItem({
TableName: tableName,
IndexName: "GeoHash-index",
KeyConditionExpression: "GeoHash = :geohash",
ExpressionAttributeValues: {":geohash": "dpz886gb0tb0"}
}),
function(err,data){
if(err){
callback(err);
} else {
callback(null,data);
}
}
};
lambda测试数据在哪里
{
"GeoHash": "dpz886gb0tb0",
"Radius": 2,
"Timestamp": 1472601493180,
"UserID": "User1"
}
GeoHash 字符串应该相互匹配。想法?
编辑 这种方法也没有成功
var AWS = require('aws-sdk');
var docClient = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = function index(event, context, callback) {
var params = {
TableName: "LocationAware1",
IndexName: "GeoHash-index",
KeyConditionExpression: "GeoHash = :geohash",
ExpressionAttributeValues: {
":geohash": {'S': 'dpz886gb0tb0'}
},
};
docClient.query(params, function(err, data) {
if (err)
console.log(JSON.stringify(err));
else
console.log(JSON.stringify(data));
});
}
当你说调用成功且没有错误时,我假设你的意思是调用 lambda
如果您使用的是节点版本 4.3,那么从 aws lambda 文档的摘录中可以看出,您从函数中 return 的方式已被弃用
The Node.js runtime v4.3 supports the optional callback parameter. You >can use it to explicitly return information back to the caller. The general syntax is:
callback(Error error, Object result);
使用回调参数是可选的。如果您不使用可选的回调参数,则行为与调用不带任何参数的回调() 相同。您可以在您的代码中指定回调以向调用方提供 return 信息。 如果您不在代码中使用回调,AWS Lambda 将隐式调用它并且 return 值为 null。
This is the correct way to return from an aws lambda function if using node version 4.3
首先像这样向处理函数添加第三个参数
exports.handler = function(event,context,callback)
那么当 return 从函数中调用时遵循这种形式
function(err,data){
if(err){
callback(err);
} else {
callback(null,data);
}
}
var AWS = require('aws-sdk');
exports.handler = function(event,context,callback) {
var params = {
TableName: 'Table1',
IndexName: 'GeoHash-index',
KeyConditionExpression: 'GeoHash = :geohash',
ExpressionAttributeValues: {
':geohash': 'dpz886g8p9e2',
}
};
var docClient = new AWS.DynamoDB.DocumentClient();
docClient.query(params, function(err, data) {
if (err) callback(err);
else callback(null, data);
});
}
重写了,很干净。