如何使用节点js来组合来自两个jsons的数据

时间:2017-12-06 01:01:43

标签: node.js amazon-web-services aws-lambda

我想合并两个表中的数据,然后将结果作为响应发送。

我是nodejs和lambda的新手,我无法弄清楚如何从两个扫描调用中合并json数据并将其作为响应发送。

如果我取消注释回调,则仅发送一个表的响应。

我的代码如下,有人可以帮助完成吗

'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);
   }
}

}

2 个答案:

答案 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);
   }
}

}

答案 1 :(得分:1)

欢迎使用JavaScript异步回调(又名callback hell)。

幸运的是,AWS SDK supports promises因此您可以使用Promise.all()等待多个承诺得到解决。发生这种情况时,合并JSON结果并通过Lambda函数的callback()方法返回合并结果。