将数据从回调(aws dynamodb扫描)传递到外部

时间:2018-04-05 23:48:50

标签: javascript node.js amazon-web-services amazon-dynamodb

我正在使用aws的dbclient.scan函数从dynamodb中检索数据。我需要使用输出数据从另一个表中检索数据。我试图将第一个db扫描的输出分配给dbclient.scan之外的变量。问题是,当我从dbclient.scan回调函数分配数据时,我得到空变量。我该怎么办?无论如何,我还没有使用承诺和异步概念。以下是我写的代码。

var tmp = []
docClient.scan(params, (error, result) => {
     if(error) { .......} 
     else{ var tmp1 = result.Items[0].data
           tmp.push(tmp1)
     }
});
console.log(tmp)//empty list

我该怎么办? 非常感谢, 海

3 个答案:

答案 0 :(得分:0)

我发现这是最简单的方法,如下所示:

let request = new AWS.DynamoDB({apiVersion: '2012-08-10'})
let params = {
    TableName: 'YOUR_TABLE_NAME',
    Key: {
        'YOUR_KEY': { S: 'STRING_VALUE_TO_MATCH' }
    }
}
let result = await request.getItem(params).promise().then((data) => {
    return data.Item 
})
// Now you can use result outside of the promise.
console.log(JSON.stringify(result))

确保此函数位于异步函数中,并且对您有效。这不是为了“扫描”,但概念应该相同。

答案 1 :(得分:-1)

直到有人向我展示了一种明智的方法,并通过真实的代码示例,这种方法通常可以正常工作:

public function listFitters(Request $request)
{
    // Get Entity manager and repository
    $em= $this->getDoctrine()->getManager();
    $qb = $em->createQueryBuilder();

    //set required role
    $role = 'ROLE_FITTER';

    $qb->select('u')
        ->from('userBundle:User', 'u')
        ->where('u.roles LIKE :roles')
        ->setParameter('roles', '%"' . $role . '"%');

    $user = $qb->getQuery()->getResult();

    // Serialize into an array the data that we need, in this case only name and id
    $responseArray = array();
    foreach ($users as $user) {
        $responseArray[] = array(
            "id" => $user->getId(),
            "name" => $user->getName()
        );
    }

    // Return array for dropdown

    return new JsonResponse($responseArray);
}

答案 2 :(得分:-2)

您误解了Javascript和回调的工作原理。 Javascript将立即自上而下处理整个文件。因此,当您执行console.log(tmp)时,上面的DynamoDB扫描尚未完成。

尝试将代码更改为以下内容以查看DynamoDB中的数据:

    var tmp = []
    docClient.scan(params, (error, result) => {
      if(error) { .......} 
      else {
        var tmp1 = result.Items[0].data
        tmp.push(tmp1)

        // now get item using results from scan   
        var params = {
          TableName: "mytable",
          Key: {
            KeyName: tmp1.KeyName
          }
        }
        docClient.get(params, (error, results) => {
          console.log(results)
        })

      }
    });

我强烈建议您查看async / await(Google results for tutorials)。这将使您在处理嵌套回调时更加轻松。