0

Ich habe eine Anforderung, wo ich auf eine Tabelle Abfrage dann Schleife durch das Ergebnis und Abfrage einer anderen Tabelle innerhalb einer Schleife .. Aber ich habe versucht mit synchronisieren Knoten js Modul. Aber irgendwann endet die API mit einem Timeout-Fehler bei dieser Methode. Jetzt versuche ich meinen Code unten, aber kein Glück.AWS Lambda Async und Sync Problem

var notification = { 
TableName: "Tablename", 
KeyConditionExpression:"#userId =:userid and #datetime <=:datetime", 
ScanIndexForward: false, 
ExpressionAttributeNames: { 
    "#userId": "userId", 
    "#datetime":"datetime" 
}, 
ExpressionAttributeValues: { 
    ":userid" :userId, 
    ":datetime" :datetime 
} 
}; 

docClient.query(notification, function(err, result) { 

if (err) { 
    context.succeed({success: false, message : JSON.stringify(err, null, 2),method:"notification",type:type}); 
}else{ 

    result = result.Items; 

    if (result.length>0) { 
     for(var i=0;i<result.length;i++){ 
      result[k]['CafeDetail']=getDetail(result[k].CafeID,function (data) { 

      }); 

      if (k ==(result.length -1)) { 
       context.succeed({success: true,data:result, message : "Notification list",method:"notification",type:type}); 
      } 

     } 
    } 

} 

}); 

function getDetail(CafeID,callback) { 
    var param = { 
     TableName: "Tablename", 
     ProjectionExpression:"CafeName,Cafe_MainImage", 
     KeyConditionExpression:"CafeID =:cafeID", 
     ExpressionAttributeValues: { 
      ":cafeID" :CafeID 
     } 
    }; 

    docClient.query(param, function(err, CafeDetail) { 
     if (err) { 
      console.log (err) 
      callback(err); 
     } else { 
      callback(CafeDetail.Items); 
      console.log(CafeDetail.Items); 
     } 
    }); 
} 

Am Ausgang dieser Variable (result [k] [ 'CafeDetail']) kommt immer als nicht definiert. Console.log innerhalb der getDetail-Funktion druckt jedoch das Ergebnis.

Ich bin Anfänger zu AWS Lambda mit Knoten js .. Jede Hilfe wird geschätzt.

Vielen Dank im Voraus

Antwort

0

Ich habe gerade eine Lösung für meine Frage. So stelle ich es, kann es sein, wird helfen, jemand anderes vor dem gleichen Problem

var notification = { 
        TableName: "Tablename", 
        KeyConditionExpression:"#userId =:userid", 
        Limit: 12, 
        ScanIndexForward: false, 
        ExpressionAttributeNames: { 
         "#userId": "userId", 
        }, 
        ExpressionAttributeValues: { 
         ":userid" :userId 
        } 
       }; 

       docClient.query(notification, function(err, result) { 
        if (err) { 
         context.succeed({success: false, message : JSON.stringify(err, null, 2),method:"notification",type:type}); 
        }else{ 
         var ret =[]; 
         var results =result.Items; 
         if (results.length>0) { 
          results.forEach(function(result, i) { 
           console.log(i); 
           var param = { 
            TableName: "Tablename", 
            ProjectionExpression:"CafeName,Cafe_MainImage", 
            KeyConditionExpression:"CafeID =:cafeID", 
            ExpressionAttributeValues: { 
             ":cafeID" :result.CafeID 
            } 
           }; 

           docClient.query(param, function(err, CafeDetail) { 
            if (err) { 
             context.succeed({success: false, message : JSON.stringify(err, null, 2),method:"notification",type:type}); 
            } else { 
             console.log(CafeDetail.Items); 
             CafeDetail =CafeDetail.Items; 
             result['CafeDetail']=CafeDetail 
             console.log(result); 
             if (i === results.length -1) { // last iteration 
              context.succeed({success: true,data:results, message : "Notification list",method:"notification",type:type}); 
             } 
            } 
           }); 
          }); 
         }else{ 
          context.succeed({success: true,data:result, message : "Notification list",method:"notification",type:type}); 
         } 
        } 
       });