Не могу понять, как node.js лямбда-функция возвращает значение после mysql запроса - PullRequest
0 голосов
/ 27 января 2020

Прежде всего, я прошу прощения, если заголовок моего вопроса вводит в заблуждение.

Я создаю API с использованием шлюза API AWS, а тип интеграции - лямбда-функция.

Так что в основном в моем интерфейсе (React) есть текстовая область, где пользователь может вводить значения поиска, каждое значение в новой строке. Я беру входные данные из этой текстовой области, разделяю их на массив, преобразую в JSON и передаю его моей конечной точке API.

Моя конечная точка API передала это значение лямбда-функции. Задача лямбда-функции состоит в том, чтобы взять это значение JSON (массив), l oop через него, найти его в базе данных и вернуть соответствующие строки.

Приведенный ниже код должен объяснить, что я пытаюсь сделать.

    exports.handler = async function(event, context) {
        context.callbackWaitsForEmptyEventLoop = false;
        var queryResult=[];
        var searchbyArray = (event.searchby);
        var len = searchbyArray.length;

        for(var i = 0; i < len; i++) {
             var sql ="SELECT * FROM aa_customer_device WHERE id LIKE '%"+searchbyArray[i]+"%'";
             con.query(sql, function(err, result) {
             if (err) throw err;
             queryResult.push(result);
         });
         var formattedJson = JSON.stringify({finalResult:queryResult});
         return formattedJson;
    }
};

Думайте о приведенном выше коде как о псевдокоде, поскольку я пробовал разные способы достижения желаемого результата.

Например, не используя asyn c и используя что-то вроде:

exports.handler = function(event, context, callback) { //code goes here }

, что приводит к

Ошибка тайм-аута

Я довольно новичок в node.js (мир асин c функция и обещания). Может ли кто-нибудь помочь в правильном направлении о том, что я делаю неправильно и как это правильно?

Единственное, что правильно в этом коде, это то, что массив 'searchbyArray' содержит правильные значения, которые необходимо искать.

Я прочитал AWS документацию AWS лямбда-функции, используя node js, и все еще не мог понять, какой правильный способ сделать это.

1 Ответ

0 голосов
/ 27 января 2020

Я считаю, что библиотека NodeJS MySQL использует обратные вызовы, а не обещания. Вам нужно будет обернуть каждый запрос обещанием, чтобы вы могли правильно await запрос или иметь возможность использовать что-то вроде Promise.all(). Вы можете использовать функцию util.promisify() для этого. В качестве альтернативы, переключитесь на Sequelize на основе обещаний для запросов MySQL в NodeJS.

. Я также предлагаю добавить множество записей в вашу функцию, чтобы вы могли точно видеть, как далеко она продвигается. где истекает время ожидания и каково содержимое переменной и какие-либо сообщения об ошибках.

Другой альтернативой будет использование Python для написания вашей лямбда-функции вместо NodeJS, которая не представляет этих асинхронных сложностей. .

...