Странно асинхронно поведение на 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 с точно същите данни от lambda, получавам statusCode: 204 (няма налични данни).

Вярвам, че това е проблем с асинхронното време. Не знам как отговорите от API могат да се различават ..

Възможно ли е API да предава отговора обратно към инициатора за известно време, а не просто импулс? И започва с поточно "няма налични данни" и след това, след няколко милисекунди "о, намерих някои данни, ето ги"? И този Postman чака потока да приключи, а ламбда функцията не го прави?

Благодаря предварително!


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)


Изглежда, че вашата заявка връща нула, защото 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

Понякога lambda има проблем с 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