当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda通过1个Lambda调用调用3个异步函数

毋琪
2023-03-14

好了,我说完了。请有人帮帮我:(

我不知道js和lambda是怎么工作的

    null
const https = require('https');
const crypto = require("crypto");
const AWS = require('aws-sdk');
const DynamoDb = new AWS.DynamoDB({region: 'eu-central-1'});

exports.handler = async (event) => {
    let response;
    
    console.log("Start");
    
    let steamTicket;
    let steamId;
    
    if(event.body){
        const body = JSON.parse(event.body);
        
        if(body.steamticket && body.steamid){
            steamTicket = body.steamticket;
            steamId = body.steamid;
        }
        else{
            response = {
                statusCode: 400,
                body: JSON.stringify({
                    authenticated: false,
                    reason: 'cant find steamid or steamticket in your request'
                })
            };
            return response;
        }
    }
    else{
        response = {
            statusCode: 400,
            body: JSON.stringify({
                authenticated: false,
                reason: 'cant find request body'
            })
        };
        return response;
    }
    
    
    await httprequest(steamTicket).then((data) =>{
        if(data.response && data.response.params){
            if(data.response.params.result == 'OK' && data.response.params.steamid == steamId){
                console.log(JSON.stringify(data));
                
                const sessionId = crypto.randomBytes(16).toString("hex");
                console.log('Generated session id: ' + sessionId);
                
                PutToDB(sessionId, steamId);
            }
            else{
                response = {
                    statusCode: 400,
                    body: JSON.stringify({
                        authenticated: false,
                        reason: 'steam response is not OK or session != steamId'
                    })
                };
                return response;
            }
        }
        else{
            response = {
                statusCode: 400,
                body: JSON.stringify({
                    authenticated: false,
                    reason: 'invalid response from steam: ' + JSON.stringify(data)
                })
            };
            return response;
        }
    });
};

async function PutToDB(sessionId, steamId){
    
    var WriteParams = {
        RequestItems:{
            SteamSessions: []
        }
    };
    
    WriteParams.RequestItems.SteamSessions.push({
        PutRequest:{
            Item: {
                SteamId: {S: steamId},
                SessionId: {S: sessionId},
                ttl: {N: (Math.floor(Date.now() / 1000) + 600).toString()}
            }
        }
    });

    console.log('SessionIdToWrite: ' + sessionId);
    return new Promise((resolve, reject) =>{
        DynamoDb.batchWriteItem(WriteParams, function(err, data){
            if(err){
                console.log("Error", err);
            }
            else{
                console.log("Success write", JSON.stringify(data));
            }
        })
    }) 
}

async function httprequest(steamTicket) {
     return new Promise((resolve, reject) => {
        const options = {
            host: 'partner.steam-api.com',
            path: '/ISteamUserAuth/AuthenticateUserTicket/v1/?key=somekey&appid=someid&ticket=' + steamTicket,
            port: 443,
            method: 'GET'
        };
        
        const req = https.request(options, (res) => {
          if (res.statusCode < 200 || res.statusCode >= 300) {
                return reject(new Error('statusCode=' + res.statusCode));
            }
            
            var body = [];
            
            res.on('data', function(chunk) {
                body.push(chunk);
            });
            
            res.on('end', function() {
                try {
                    body = JSON.parse(Buffer.concat(body).toString());
                } catch(e) {
                    reject(e);
                }
                resolve(body);
            });
        });
        req.on('error', (e) => {
          reject(e.message);
        });
        // send the request
       req.end();
    });
}

最令人困惑的是!这个b给我这个测试结果:

运行1:

2021-03-05T13:28:47.741Z    INFO    Start
2021-03-05T13:28:48.612Z    INFO    {"response":{"params":{"result":"OK","steamid":"mysteamid","ownersteamid":"mysteamid","vacbanned":false,"publisherbanned":false}}}
2021-03-05T13:28:48.650Z    INFO    Generated session id: 6a5633a5f862d8663d0fe546a9c89feb
2021-03-05T13:28:48.650Z    INFO    SessionIdToWrite: 6a5633a5f862d8663d0fe546a9c89feb

DynamoDb是空的,这里我们看不到DynamoDb.BatchWriteItem结果的日志。

2021-03-05T13:29:53.308Z    INFO    Start
2021-03-05T13:29:53.674Z    INFO    Success write {"UnprocessedItems":{}}
2021-03-05T13:29:54.048Z    INFO    {"response":{"params":{"result":"OK","steamid":"mysteamid","ownersteamid":"mysteamid","vacbanned":false,"publisherbanned":false}}}
2021-03-05T13:29:54.048Z    INFO    Generated session id: 05c62de782202fc100cea9d47e38242c
2021-03-05T13:29:54.048Z    INFO    SessionIdToWrite: 05c62de782202fc100cea9d47e38242c

共有1个答案

岳迪
2023-03-14

您需要在Dynamodb.BatchWriteItem调用中调用reject/resolve。

return new Promise((resolve, reject) =>{
    DynamoDb.batchWriteItem(WriteParams, function(err, data){
        if(err){
            console.log("Error", err);
            reject(err);
        }
        else{
            console.log("Success write", JSON.stringify(data));
            resolve();
        }
    })
}) 
 类似资料:
  • 问题内容: 我需要从另一个lambda异步调用aws lambda。我有一个用于同步呼叫的工作代码。 但就我而言,“ testLambda”是一个耗时的函数。因为我需要在调用“ testLambda”函数后退出。然后像这样更新代码 它正确返回消息。但是我的’testLambda’函数没有被调用(测试lambda不会生成云监视日志)。与此代码相关的问题是什么。 问题答案: 根据Lambda invo

  • 我有一个由S3推送事件触发的AWS Lambda。lambda将调用一个API,这将触发一个长时间运行的进程。我认识到我可以配置S3异步调用lambda函数,因此S3不会等待响应,但我很想知道我是否可以配置lambda异步调用我的API。我不希望lambda在过程完成时等待几分钟。有人能给我指出一些概述这个过程的留档吗?提前谢谢。

  • 是否可以通过http请求(GET或POST)直接调用AWS Lambda函数?如果没有,是否有通过SNS或S3的解决方案?因为我想不出一个。。。 具体来说,我想使用 JSON 创建一个小的 API

  • 我有一个用c#编写的AWS lambda函数。此函数负责调用5-6个API调用(Post请求)。 所有这些API调用都是相互独立的。 我不关心这些API调用的响应。 即使我不关心后续响应,每个API调用也需要大约5秒才能完成。 问题:我希望lambda函数在一秒钟内执行并响应。如何异步进行API调用,使lambda函数能够在我的时间限制内完成所有这些操作,而不必等待API调用的响应?理想情况下,我

  • 我调用了多个ajax调用,但代码只在所有ajax调用执行之后才到达API。 JavaScript: AppFactory API 链接工作很好,但我需要运行两个独立,我真的想知道发生了什么。 谢谢!!!

  • 问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调