Моя лямбда заканчивается до завершения кода - node.js - PullRequest
1 голос
/ 21 января 2020

Я знаю, что раньше об этом спрашивали по-разному, но я не могу понять это. Я все еще очень новичок в node.js и лямбде. Этот код будет работать, если я запускаю лямбду дважды, но никогда не запускаюсь до завершения в первый раз. Это также работает нормально, если я запускаю это из локальной среды IDE, добавляя exports.handler(); в конец блока кода.

Код запрашивает результаты у DynamoDB, а затем пытается удалить эти записи из Dynamo. Кажется, что часть запроса работает каждый раз, но часть удаления не выполняется при первом вызове. Кажется, я не могу понять, какие изменения необходимы лямбде, чтобы дождаться завершения всех моих процессов.

Заранее спасибо.

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set the region
AWS.config.update({ region: 'us-east-2' });
exports.handler = async (event) => {
    // Create DynamoDB service object
    const ddb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });
    const documentClient = new AWS.DynamoDB.DocumentClient({ region: "us-east-2" });
    const tablename = process.env.table_name;

    let dynapromises = [];

    let params = {
        ExpressionAttributeValues: {
            ':offNum': { S: process.env.cost_center },
            ':s': { N: '2' }
        },
        ExpressionAttributeNames: {
            "#notif_status": "status"
        },
        KeyConditionExpression: 'officeNumber = :offNum',
        TableName: tablename,
        IndexName: 'officeNumberIndex',
        ProjectionExpression: "notificationNumber",
        FilterExpression: '(attribute_not_exists(#notif_status) or #notif_status = :s) and attribute_not_exists(statusTimes)'
    };

    let qresults = await ddb.query(params).promise();
    console.log("Count of notifs again " + qresults.Items.length);

    qresults.Items.forEach(function(element, index, array) {
        console.log(element.notificationNumber.S);
        let delparams = {
            TableName: tablename,
            ReturnValues: "ALL_OLD",
            Key: {
                notificationNumber: {
                    S: element.notificationNumber.S
                }
            }
        };

        dynapromises.push(ddb.deleteItem(delparams).promise().then(function(data) {
            console.log("Deleted Record:"+ JSON.stringify(data)); // successful response
        }, function(error) {
            console.log(error, error.stack); // an error occurred
        }));
        console.log("deletion parameters " + JSON.stringify(delparams));
    });
    Promise.all(dynapromises).then(res => {
        console.log("All promises done");
    });
    return qresults.Items.length;
};

Ответы [ 2 ]

1 голос
/ 21 января 2020

Проблема в том, что вы возвращаетесь до того, как все обещания будут выполнены, вам нужно переместить return qresults.Items.length; внутрь последней then.

, попробовав с этим кодом:

** ОБНОВЛЕНИЕ: изменить фрагмент с рабочим кодом **

// Load the AWS SDK for Node.js
const AWS = require('aws-sdk');
// Set the region
AWS.config.update({ region: 'us-east-2' });
exports.handler = async (event) => {
    // Create DynamoDB service object
    const ddb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });
    const documentClient = new AWS.DynamoDB.DocumentClient({ region: "us-east-2" });
    const tablename = process.env.table_name;

    let params = {
        ExpressionAttributeValues: {
            ':offNum': { S: process.env.cost_center },
            ':s': { N: '2' }
        },
        ExpressionAttributeNames: {
            "#notif_status": "status"
        },
        KeyConditionExpression: 'officeNumber = :offNum',
        TableName: tablename,
        IndexName: 'officeNumberIndex',
        ProjectionExpression: "notificationNumber",
        FilterExpression: '(attribute_not_exists(#notif_status) or #notif_status = :s) and attribute_not_exists(statusTimes)'
    };

    let qresults = await ddb.query(params).promise();
    console.log("Count of notifs again " + qresults.Items.length);

    const dynapromises = qresults.Items.map( async element => {
    	let delparams = {
            TableName: tablename,
            ReturnValues: "ALL_OLD",
            Key: {
                notificationNumber: {
                    S: element.notificationNumber.S
                }
            }
        };

        try {
        	 console.log("deletion parameters " + JSON.stringify(delparams));
	        const data = await ddb.deleteItem(delparams).promise();
    	    console.log( "Deleted Record:"+ JSON.stringify(data) );
        } catch ( err ) {
        	console.log(error, error.stack); // an error occurred
        }
    } )

    await Promise.all(dynapromises)

    console.log("All promises done");
    return qresults.Items.length;
};
0 голосов
/ 23 января 2020

Код, который разместил @pepo, выполняет удаление Dynamo при первом вызове Lambda. Спасибо за его работу и ответы от всех.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...