【问题标题】:Lambda Axios post to second API weird async behaviourLambda Axios 发布到第二个 API 奇怪的异步行为
【发布时间】:2020-03-03 22:49:41
【问题描述】:

我的 lambda 函数有问题。这是当前设置:

Lambda 向 API 发出 post 请求。 API 从 postgres 数据库中获取数据并返回该数据。当我使用 Postman 或我的 lambda 函数的本地版本时,这是可行的。当我使用实际的 lambda 函数时,API 返回的数据为 null。

下面是一些sn-ps的代码:

λ

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

当我从 Postman 调用 API 时,我得到 statusCode: 200(数据可用)

如果我使用来自 lambda 的完全相同的数据调用 API,我会得到 statusCode:204(无可用数据)

我相信这是一些异步计时问题。我不知道 API 的响应有何不同..

API 是否有可能在一段时间内将响应流回给发起者,而不仅仅是一个冲动?首先是流式传输“没有可用数据”,然后在几毫秒后“哦,我找到了一些数据,就在这里”?那个 Postman 等待流完成而 lambda 函数没有?

提前致谢!

【问题讨论】:

  • 能否分享一下lambda和API的全部功能?
  • @idoshamun 是的,我向两者都添加了更多代码
  • 尝试在您的 API 中添加一些日志记录,以检查您从 Lambda 函数获得的变量。调试进程,因为表面上看起来不错

标签: node.js amazon-web-services asynchronous aws-lambda axios


【解决方案1】:

您的查询似乎返回 null,因为 req.body.var 不存在。您可以尝试将您的 lambda 函数更改为:

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 工作。

【讨论】:

  • 谢谢,有时您只是想念那些愚蠢而微小的事情!你说得对,参数太高了!
【解决方案2】:

有时 lambda 会遇到异步等待问题,所以我建议您编写这样的代码

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2015-12-29
    • 1970-01-01
    • 2020-07-28
    • 2021-02-11
    • 2017-05-13
    相关资源
    最近更新 更多