首页 > 解决方案 > 将变量值从 JavaScript 函数传递到 SQL 查询 AWS Lambda

问题描述

我正在制作一个无服务器电话目录搜索应用程序。有两个文件:index.html 和 lambda_function.py

index.html 有一个 JS 函数、一个用于输入名称的文本字段和一个搜索按钮。Lambda_function.py 包含处理 CSV 的代码。

我无法将 index.html 文本框中的值传递给 lambda_function.py SQL 查询。浏览器调试器报告错误。

errorMessage: "name 'name_Person' is not defined"
​
errorType: "NameError"
​
stackTrace: Array [ "  File \"/var/task/lambda_function.py\", line 12, in lambda_handler\n    sql_q = \"SELECT * FROM s3object s where s.\\\"Name\\\" = ('%s')\" %name_Person\n" ]

在这种情况下,将用户输入的名称传递给 SQL 查询的正确方法是什么?

index.html 内容

<script>

    function FindInPhoneBook() {
        var name_person = $('#name').val();
        if (name_person == "")
            return;
        fetch('https://xxx.eu-west-3.amazonaws.com/SecondStage', {
            method: 'POST',
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            },
            body: '{ "command": "find", "name_Person":"'+name_person+'" }'
        }).then(function(data) {
            $('#list_personal').val(data)
            find();
            data.json().then(function(bodyData) {
                console.log(bodyData);
                $('#list_personal').text(bodyData);
            })
        })
    }
        
</script>
<div class = "border">


<input id="name" type="text">
<button onclick="FindInPhoneBook()">
Find
</button>  
<br></br>
<div id='list_personal'></div>
</div>

lambda_function.py content
import json
import boto3
def lambda_handler(event, context):
    res = ''
    s3 = boto3.client('s3')

    if(len(event) == 0):
        with open('index.html','r') as file:
            return file.read()
    elif event['command'] == 'find':
        #name = 'Vinod'
        sql_q = "SELECT * FROM s3object s where s.\"Name\" = ('%s')" %name_Person
        resp = s3.select_object_content(
            Bucket='chumbacket',
            Key='sample_data.csv',
            ExpressionType='SQL',
            Expression=sql_q,
            InputSerialization = {'CSV': {"FileHeaderInfo": "Use"}, 'CompressionType': 'NONE'},
            OutputSerialization = {'CSV': {}},
        )
        
        for event in resp['Payload']:
            if 'Records' in event:
                records = event['Records']['Payload'].decode('utf-8')
            
        return records
    elif 1==1:
        pass
        
    return res

标签: javascriptpython-3.xamazon-web-servicesamazon-s3aws-lambda

解决方案


您可以通过使用 Lambda API 调用 Lambda 函数并调用调用方法将数据传递给 Lambda 函数。您可以将数据作为 JSON 数据传递给它。这是一个用 Java 实现的示例(但将向您展示如何使用 Lambda API 来调用 Lambda 操作并传递数据)

https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javav2/example_code/lambda/src/main/java/com/example/lambda/LambdaInvoke.java

您可以在此处查看适用于 JavaScript v3 AWS Lambda 的 AWS 开发工具包示例。这是在 HTML 的脚本标记中使用的 API。

https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/lambda


推荐阅读