AWS лямбда - как использовать условные выражения в зависимости от того, существуют ли параметры запроса? - PullRequest
0 голосов
/ 09 июня 2019

Я хочу, чтобы моя функция возвращала список всего в таблице, если нет параметров запроса, и одну строку, если идентификатор параметра существует

var mysql = require('mysql');
var config = require('./config.json');
var pool  = mysql.createPool({
    host     : config.host,
    user     : config.user,
    password : config.password,
    database : config.database
  });
  exports.handler = (event, context, callback) => {
      var whereClause
      if(event.queryStringParameters.id !== null){
          let id = event.queryStringParameters.id
          whereClause = ' where id='+id
      }
    context.callbackWaitsForEmptyEventLoop = false;
    pool.getConnection(function(err, connection) {
        // Use the connection
        connection.query('SELECT * from users'+whereClause, function (error, results, fields) {
        // And done with the connection.
        connection.release();
        // Handle error after the release.
        if (err) callback(err);
        else {
            var response = {
                "statusCode": 200,
                "headers": {
                    "my_header": "my_value"
                },
                "body": JSON.stringify(results),
                "isBase64Encoded": false
            };
            callback(null, response);
        }
        });
    });
};

, функция завершается ошибкой, когда отсутствует параметр запросас ошибкой

"Невозможно прочитать свойство 'id' с нулевым значением"

почему это так?

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Вы не предоставили никакой информации о номере строки или трассировке стека, поэтому я предполагаю, что это, если оператор завершится неудачно, потому что event.queryStringParameters равен нулю:

if(event.queryStringParameters.id !== null)
    let id = event.queryStringParameters.id
    whereClause = ' where id='+id
}

И вместо этого вы должны написать:

if (event.queryStringParameters && event.queryStringParameters.id !== null) {
    let id = event.queryStringParameters.id;
    whereClause = ' where id=' + id;
}

Сказав это, вы должны , а не вводить введенные пользователем значения (например, id) в запросы SQL, используя конкатенацию строк. Это открывает вам возможность атаки SQL Injection . Вот идеи о том, как написать этот код более безопасно: Как предотвратить SQL-инъекцию в Node.js

0 голосов
/ 09 июня 2019

Используете ли вы AWS Lambda с Amazon API Gateway? AWS Lambda с Amazon API Gateway

В этом случае:

Убедитесь, что вы создали шаблон сопоставления тела в шлюзе API (Запрос интеграции-> Отображение телаШаблоны).В качестве примера приведем шаблон отображения тела, который будет передавать электронную почту параметра запроса в вашу лямбда-функцию: {"id": "$ input.params ('id')"}

Форум разработчиков AWS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...