Node.js 为什么我的代码没有';我什么也没放在桌子上?

Node.js 为什么我的代码没有';我什么也没放在桌子上?,node.js,amazon-web-services,aws-lambda,amazon-dynamodb,Node.js,Amazon Web Services,Aws Lambda,Amazon Dynamodb,我试图从存储在S3中的csv文件导入数据,并将数据放入DYNADB表中。在node.js中的Lambda函数中,一切正常,数据导出良好 我试图看看我的项是否有问题,所以我将var参数放在函数的开头(在s3.getObjet之前),并将数据放在我的dynamoDB表中。 此外,我试图查看我的问题是否是if,但没有console.log在if中正常工作。 我认为,唯一的问题是我的代码,我认为这是一个范围问题 var AWS=require(“AWS sdk”), documentClient=新的A

我试图从存储在S3中的csv文件导入数据,并将数据放入DYNADB表中。在node.js中的Lambda函数中,一切正常,数据导出良好

我试图看看我的项是否有问题,所以我将var参数放在函数的开头(在s3.getObjet之前),并将数据放在我的dynamoDB表中。 此外,我试图查看我的问题是否是if,但没有console.log在if中正常工作。 我认为,唯一的问题是我的代码,我认为这是一个范围问题

var AWS=require(“AWS sdk”),
documentClient=新的AWS.DynamoDB.documentClient();
var s3=新的AWS.s3();
exports.handler=函数(事件、上下文、回调){
var src_bkt=event.Records[0].s3.bucket.name;
var src_key=event.Records[0].s3.object.key;
var文件;
木质变种;
//检索对象
s3.getObject({
桶:src_bkt,
键:src_键
},函数(错误,数据文件){
如果(错误){
日志(err,err.stack);
回调(err);
}否则{
file=dataFile.Body.toString('ascii');
var rows=file.split('\n');
用于(行中的变量i){
lignea=行[i]。拆分(“;”);
if(lignea[2].startsWith('/France/Toulouse/')){
console.log(“嘿”);
变量参数={
项目:{
“资产负债表”:“c”,
“MAINHOST”:“c”
},
TableName:process.env.TABLE\u名称
};
documentClient.put(参数、函数(错误、数据){
回调(错误、数据);
});
}
}
}
});
};
编辑:在帮助下,我的异步代码如下:

var AWS=require(“AWS sdk”),
documentClient=新的AWS.DynamoDB.documentClient();
var s3=新的AWS.s3();
exports.handler=异步函数(事件、上下文、回调){
var src_bkt=event.Records[0].s3.bucket.name;
var src_key=event.Records[0].s3.object.key;
var文件;
木质变种;
试一试{
//检索对象
const dataFile=s3.getObject({
桶:src_bkt,
键:src_键
}).promise();
file=dataFile.Body.toString('ascii');
var rows=file.split('\n');
用于(行中的变量i){
lignea=行[i]。拆分(“;”);
if(lignea[2].startsWith('/France/Toulouse/')){
console.log(“嘿”);
变量参数={
项目:{
“资产负债表”:“测试1”,
“MAINHOST”:“test2”
},
TableName:process.env.TABLE\u名称
};
等待documentClient.put(params.promise();
}
}
}捕获(e){
控制台。错误(“失败”);
}
};

谢谢你的帮助

没错,这是一个范围问题,因为您在for循环中调用异步函数。你可以这样重写,我相信:

function putDocument (params) {
    return function() { documentClient.put(params, callback) };
}

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
        };
        putDocument(params);
    }
}

在定义
参数时,您也可以尝试使用
let
,因为它将具有正确的作用域,或者使用
.forEach
创建闭包。

当第一个put结果出现时,您实际上是在调用处理程序的回调,这将导致进程立即结束

尝试以下更改:

exports.handler=异步函数

这将启用异步/等待机制来处理异步代码

等待documentClient.put(params.promise()

几乎所有AWS方法都有这个变量,它返回一个
Promise
,而不是使用回调<代码>等待
语法以同步方式等待承诺结果

const dataFile = await s3.getObject({
        Bucket: src_bkt,
        Key: src_key
    }).promise();
删除任何回调

将整个处理程序关闭到一个
try/catch
块中。

我注意到两件事

  • 您正在循环中为每行的每行调用回调
  • 您正在使用相同的参数调用put
您应该使用类似“async”的包

var AWS=require(“AWS sdk”),
documentClient=新的AWS.DynamoDB.documentClient();
var s3=新的AWS.s3();
var async=require(“异步”)
exports.handler=函数(事件、上下文、回调){
var src_bkt=event.Records[0].s3.bucket.name;
var src_key=event.Records[0].s3.object.key;
var文件;
木质变种;
//检索对象
s3.getObject({
桶:src_bkt,
键:src_键
},函数(错误,数据文件){
如果(错误){
日志(err,err.stack);
返回回调(err);
} 
var things_to_insert=[]
file=dataFile.Body.toString('ascii');
var rows=file.split('\n');
用于(行中的变量i){
lignea=行[i]。拆分(“;”);
if(lignea[2].startsWith('/France/Toulouse/')){
console.log(“嘿”);
变量参数={
项目:{
“ASSETTAG”:lignea[0],//这必须是您的分区密钥
“MAINHOST”:lignea[1]//这必须是您的排序键
},
TableName:process.env.TABLE\u名称
};
对象插入推送(参数)
}
}
forEachOf(东西到插入,函数(参数,键,cb){
documentClient.put(参数、函数(错误、数据){
cb(错误、数据);
});
},函数(err){
回调(err)//最后只调用一次
})
});

};尽可能多地使用ES6。你能检查一下你得到的表名吗?它仍然不起作用,但你是对的问题是循环,但我不明白为什么我认为我在代码中有错误,并对上面的答案进行了修复。我还提供了第一个闭包解决方案的一些替代方案。感谢您的回答,但是如果我这样做,我无法将toString放入我的数据文件变量,因此我的代码无法工作,我不熟悉异步函数,所以我认为我在你编辑的代码中做得不好,你忘了在s3之前加入
wait
。getObject
调用,就像我写的一样。我太笨了!感谢