为什么我的代码没有在我的表中放任何东西?
我试图从存储在S3中的csv文件导入数据,并将数据放入DynamoDB表中。在我的Lambda函数中,在node.js中,一切正常,我的数据导出得很好。
我试着看看它是否与我的Item有问题,所以我将var params放在函数的开头(在s3.getObjet之前)并将数据放入我的dynamoDB表中。此外,我试图看看我的问题是否是我的问题,但没有console.log在if中正常工作。我想,唯一的问题是我的代码,我认为这是一个范围问题?
var AWS = require("aws-sdk"),
documentClient = new AWS.DynamoDB.DocumentClient();
var s3 = new AWS.S3();
exports.handler = function(event, context, callback) {
var src_bkt = event.Records[0].s3.bucket.name;
var src_key = event.Records[0].s3.object.key;
var file;
var lignea;
// Retrieve the object
s3.getObject({
Bucket: src_bkt,
Key: src_key
}, function(err, dataFile) {
if (err) {
console.log(err, err.stack);
callback(err);
} else {
file = dataFile.Body.toString('ascii');
var rows = file.split('\n');
for(var i in rows){
lignea = rows[i].split(';');
if(lignea[2].startsWith('/France/Toulouse/')){
console.log("hey");
var params = {
Item : {
"ASSETTAG" : 'c',
"MAINHOST" : 'c'
},
TableName : process.env.TABLE_NAME
};
documentClient.put(params, function(err, data){
callback(err, data);
});
}
}
}
});
};
编辑:在帮助下,我的异步代码是这样的:
var AWS = require("aws-sdk"),
documentClient = new AWS.DynamoDB.DocumentClient();
var s3 = new AWS.S3();
exports.handler = async function(event, context, callback) {
var src_bkt = event.Records[0].s3.bucket.name;
var src_key = event.Records[0].s3.object.key;
var file;
var lignea;
try{
// Retrieve the object
const dataFile = s3.getObject({
Bucket: src_bkt,
Key: src_key
}).promise();
file = dataFile.Body.toString('ascii');
var rows = file.split('\n');
for(var i in rows){
lignea = rows[i].split(';');
if(lignea[2].startsWith('/France/Toulouse/')){
console.log("hey");
var params = {
Item : {
"ASSETTAG" : 'test1',
"MAINHOST" : 'test2'
},
TableName : process.env.TABLE_NAME
};
await documentClient.put(params).promise();
}
}
}catch(e){
console.error("FAIL");
}
};
谢谢您的帮助 !
回答如下:当第一个put结果出现时,你实际上正在调用handler的回调,这导致进程的即时结束。
尝试以下更改:
exports.handler = async function
这使得async / await机制能够处理异步代码。
await documentClient.put(params).promise();
几乎所有AWS方法都有此变量返回Promise
而不是使用回调。 await
语法以同步方式等待Promise结果。
const dataFile = await s3.getObject({
Bucket: src_bkt,
Key: src_key
}).promise();
删除任何回调。
将整个处理程序关闭到try/catch
块中。
为什么我的代码没有在我的表中放任何东西?
我试图从存储在S3中的csv文件导入数据,并将数据放入DynamoDB表中。在我的Lambda函数中,在node.js中,一切正常,我的数据导出得很好。
我试着看看它是否与我的Item有问题,所以我将var params放在函数的开头(在s3.getObjet之前)并将数据放入我的dynamoDB表中。此外,我试图看看我的问题是否是我的问题,但没有console.log在if中正常工作。我想,唯一的问题是我的代码,我认为这是一个范围问题?
var AWS = require("aws-sdk"),
documentClient = new AWS.DynamoDB.DocumentClient();
var s3 = new AWS.S3();
exports.handler = function(event, context, callback) {
var src_bkt = event.Records[0].s3.bucket.name;
var src_key = event.Records[0].s3.object.key;
var file;
var lignea;
// Retrieve the object
s3.getObject({
Bucket: src_bkt,
Key: src_key
}, function(err, dataFile) {
if (err) {
console.log(err, err.stack);
callback(err);
} else {
file = dataFile.Body.toString('ascii');
var rows = file.split('\n');
for(var i in rows){
lignea = rows[i].split(';');
if(lignea[2].startsWith('/France/Toulouse/')){
console.log("hey");
var params = {
Item : {
"ASSETTAG" : 'c',
"MAINHOST" : 'c'
},
TableName : process.env.TABLE_NAME
};
documentClient.put(params, function(err, data){
callback(err, data);
});
}
}
}
});
};
编辑:在帮助下,我的异步代码是这样的:
var AWS = require("aws-sdk"),
documentClient = new AWS.DynamoDB.DocumentClient();
var s3 = new AWS.S3();
exports.handler = async function(event, context, callback) {
var src_bkt = event.Records[0].s3.bucket.name;
var src_key = event.Records[0].s3.object.key;
var file;
var lignea;
try{
// Retrieve the object
const dataFile = s3.getObject({
Bucket: src_bkt,
Key: src_key
}).promise();
file = dataFile.Body.toString('ascii');
var rows = file.split('\n');
for(var i in rows){
lignea = rows[i].split(';');
if(lignea[2].startsWith('/France/Toulouse/')){
console.log("hey");
var params = {
Item : {
"ASSETTAG" : 'test1',
"MAINHOST" : 'test2'
},
TableName : process.env.TABLE_NAME
};
await documentClient.put(params).promise();
}
}
}catch(e){
console.error("FAIL");
}
};
谢谢您的帮助 !
回答如下:当第一个put结果出现时,你实际上正在调用handler的回调,这导致进程的即时结束。
尝试以下更改:
exports.handler = async function
这使得async / await机制能够处理异步代码。
await documentClient.put(params).promise();
几乎所有AWS方法都有此变量返回Promise
而不是使用回调。 await
语法以同步方式等待Promise结果。
const dataFile = await s3.getObject({
Bucket: src_bkt,
Key: src_key
}).promise();
删除任何回调。
将整个处理程序关闭到try/catch
块中。