2017-12-06 8 views
0

2つのテーブルのデータをマージし、その結果をレスポンスとして送信します。ノードjsを使用して2つのjsonsのデータを結合する方法

私はnodejsとlambdaを使い慣れていないので、両方のスキャン呼び出しからjsonデータをどのようにマージしてレスポンスとして送ることができないのか分かりません。

コールバックのコメントを外すと、1つのテーブルのみの応答が送信されます。

私のコードの下で、誰かがそれを

'use strict'; 
const AWS = require("aws-sdk"); 
const dynamodb = new AWS.DynamoDB(); 
const docClient = new AWS.DynamoDB.DocumentClient(); 

exports.handler = function(event, ctx, callback) { 

var params= { 
     TableName:'x', 
     FilterExpression:'SessionId = :SessionId', 
ExpressionAttributeValues:{ ":SessionId" : 'ca47a131'}, 
}; 


var params1= { 
    TableName:'y', 
    FilterExpression:'sessionid = :SessionId', 
    ExpressionAttributeValues:{ ":SessionId" : 'ca47a131'}, 
}; 

docClient.scan(params, onScan); 
docClient.scan(params1, onScan1); 

function onScan(err, data){ 
    if(err){ 
     callback(err, null); 
    }else{ 

     //callback(null, data); 
    } 
} 
function onScan1(err, data){ 
    if(err){ 
     callback(err, null); 
    }else{ 

     //callback(null, data); 
    } 
} 

} 

答えて

1

を完了して助けてくださいすることができますJavaScriptの非同期コールバック(別名callback hell)へようこそ。

AWS SDK supports promisesPromise.all()を使用すると、複数の約束が解決されるのを待つことができます。その場合、JSONの結果をマージし、Lambda関数のcallback()メソッドを介してマージした結果を返します。

+0

プロミスを使用して問題を解決しました。ありがとう! –

2

単一のコールバックで応答を送信できるように、コードに次の変更を使用できます。

'use strict'; 
const AWS = require("aws-sdk"); 
const dynamodb = new AWS.DynamoDB(); 
const docClient = new AWS.DynamoDB.DocumentClient(); 

exports.handler = function(event, ctx, callback) { 

var params= { 
     TableName:'x', 
     FilterExpression:'SessionId = :SessionId', 
ExpressionAttributeValues:{ ":SessionId" : 'ca47a131'}, 
}; 

var params1= { 
    TableName:'y', 
    FilterExpression:'sessionid = :SessionId', 
    ExpressionAttributeValues:{ ":SessionId" : 'ca47a131'}, 
}; 

docClient.scan(params, onScan); 
docClient.scan(params1, onScan1); 

var firstResultData = false; 
function runAfterBothCallbacks(data){ 
    if(!firstResultData){ 
    firstResultData = data; 
    }else{ 
    // Combine firstResultData with data and return in the callback 
    callback(null,{ dataX: firstResultData, dataY: data }); 
    // Note: The order of scan and scan1 result coming cannot be guaranteed so, dataX can be the results of scan or scan1. If you can identify the result based on the scan, either pass it as another parameter to the runAfterBothCallbacks method or identify the scan based on data result (If possible). 
    } 

} 

function onScan(err, data){ 
    if(err){ 
     callback(err, null); 
    }else{ 
     runAfterBothCallbacks(data); 
    } 
} 
function onScan1(err, data){ 
    if(err){ 
     callback(err, null); 
    }else{ 
     runAfterBothCallbacks(data); 
    } 
} 

} 
関連する問題