Сообщение Lambda Axios о странном асинхронном поведении второго API

У меня проблемы с лямбда-функцией. Это текущая настройка:

Lambda отправляет запрос на публикацию в API. API извлекает данные из базы данных postgres и возвращает эти данные. Когда я использую Postman или локальную версию моей лямбда-функции, это работает. Когда я использую фактическую лямбда-функцию, API возвращает данные с нулевым значением.

Ниже приведены некоторые фрагменты кода:

лямбда:

const axios = require('axios')

exports.handler = async (event) => {
  let rows = await axios.post('http:/server/getData', {
                params: {
                  var: event.var
                }
              })

  if(rows.data.statusCode == 204){
    //no data available
  }
  else{
    data = rows.data.info
  }
};

Компонент API-маршрутизатора

var router = express.Router()
const Pool = require('pg').Pool

const mgmtdb = new Pool({ ... })

router.post('/getData', function(req, res){
  database.query("SELECT info FROM table WHERE var=$1", [req.body.var], (error, results) => {
    const rows = results.rows

    if (error) {
      throw error
    }

    let status = rows.length == 0 ? 204 : 200
    var responseJSON ={};
    responseJSON.statusCode = status;
    responseJSON.info= rows[0] ? rows[0].info : null;
    res.json(responseJSON);
  })
})

module.exports = router

Когда я вызываю API из Postman, я получаю statusCode: 200 (данные доступны).

Если я вызываю API с теми же данными из лямбда-выражения, я получаю statusCode: 204 (данные отсутствуют).

Я считаю, что это проблема с асинхронным временем. Не знаю, чем могут отличаться ответы API ..

Возможно ли, что API в течение некоторого времени передает ответ отправителю, а не просто импульс? И начинается с потоковой передачи «данные отсутствуют», а затем, через несколько миллисекунд «о, я нашел некоторые данные, вот они»? И этот почтальон ждет завершения потока, а лямбда-функция - нет?

Заранее спасибо!


person matsbauer    schedule 07.11.2019    source источник
comment
Не могли бы вы рассказать обо всех функциях лямбда-выражения и API?   -  person idoshamun    schedule 07.11.2019
comment
@idoshamun Да, я добавил больше кода в оба   -  person matsbauer    schedule 07.11.2019
comment
попробуйте добавить логирование в свой API, чтобы проверить переменные, которые вы получаете от функции Lambda. Отлаживайте процесс, потому что на первый взгляд он выглядит хорошо   -  person idoshamun    schedule 07.11.2019


Ответы (2)


Похоже, ваш запрос возвращает null, потому что req.body.var не существует. Можете ли вы попробовать изменить свою лямбда-функцию на это:

const axios = require('axios')

exports.handler = async (event) => {
  let rows = await axios.post('http:/server/getData', {
                  var: event.var
              })

  if(rows.data.statusCode == 204){
    //no data available
  }
  else{
    data = rows.data.info
  }
};

Это в основном удаляет лишний уровень params и заставляет req.body.var работать.

person Edrian    schedule 07.11.2019
comment
Спасибо, иногда просто скучаешь по глупым и мелким вещам! Вы правы, параметров было слишком много! - person matsbauer; 07.11.2019

Иногда у лямбда есть проблема с async await, поэтому я предлагаю вам написать такой код

  exports.handler = async (event, callback) => {
    axios.post('http:/server/getData', {
        var: event.var
    })
    .then((response) => {
        callback(null, {
            statusCode: 200,
            body: JSON.stringify(response)
        })
    })
};
person Ankur Patel    schedule 07.11.2019