Лямбда Аксиос пост во втором API странное асинхронное поведение - PullRequest
2 голосов
/ 07 ноября 2019

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

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

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

lambda :

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 из Почтальона, я получаю код состояния: 200 (данные доступны) .

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

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

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

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

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

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

  exports.handler = async (event, callback) => {
    axios.post('http:/server/getData', {
        var: event.var
    })
    .then((response) => {
        callback(null, {
            statusCode: 200,
            body: JSON.stringify(response)
        })
    })
};
1 голос
/ 07 ноября 2019

Похоже, ваш запрос возвращает ноль, потому что 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 работать.

...