最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

为什么我的代码没有在我的表中放任何东西?

IT培训 admin 4浏览 0评论

为什么我的代码没有在我的表中放任何东西?

我试图从存储在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块中。

发布评论

评论列表 (0)

  1. 暂无评论