【问题标题】:promise.then not working inside async lambda handlerpromise.then 在异步 lambda 处理程序中不起作用
【发布时间】:2018-07-04 09:38:53
【问题描述】:

我在这里实现了一个简单的数据库调用 这有效,输出为success

const Database = require('../utils/Database')

module.exports.logActivityLog =  (event, context, callback) => {
    try {
        context.callbackWaitsForEmptyEventLoop = false
        const db = new Database('config1')
        var p1 = db.findOne('logs', { id: 1 })
        var p2 = db.findOne('logs', { id: 1 })

        Promise.all([p1, p2]).then((values) => {
            console.log(db.getConnection().threadId)
            console.log('values', values)
            callback(null, 'success')
        }).catch((e) => {
            console.log(e)
            callback(null, 0)
        })
    } catch (error) {
        console.log(error)
        callback(null, 'error')
    }
}

现在,如果我使用 async 作为处理程序,它总是以 null 输出,尽管我的 promiss.all.thenconsole.log 有效。

module.exports.logActivityLog = async (event, context, callback) => {
    //exactly same as above
}

我需要第二种方法来工作。我在这里做错了吗?

【问题讨论】:

    标签: node.js lambda aws-lambda


    【解决方案1】:

    你可以这样做

    const Database = require('../utils/Database')
    
    module.exports.logActivityLog = async (event, context, callback) => {
        try {
            context.callbackWaitsForEmptyEventLoop = false
            const db = new Database('config1')
            var p1 = await db.findOne('logs', { id: 1 })
            var p2 = await db.findOne('logs', { id: 1 })
            console.log(db.getConnection().threadId)
            console.log('values', p1, p2)
            callback(null, 'success')
        } catch (error) {
            console.log(error)
            callback(null, 'error')
        }
    }
    

    或者如果你希望数据库操作并行运行,试试这个

    var [p1, p2] = [
      await db.findOne('logs', { id: 1 }), 
      await db.findOne('logs', { id: 1 })
    ]
    

    【讨论】:

      【解决方案2】:

      当使用async/await 时,你应该await 你的承诺:

      const Database = require('../utils/Database')
      
      module.exports.logActivityLog = async (event, context, callback) => {
          try {
              context.callbackWaitsForEmptyEventLoop = false
              const db = new Database('config1')
              var p1 = db.findOne('logs', { id: 1 })
              var p2 = db.findOne('logs', { id: 1 })
      
              try {
                  const values = await Promise.all([p1, p2])
                  console.log(db.getConnection().threadId)
                  console.log('values', values)
                  callback(null, 'success')
              } catch (e) {
                  console.log(e)
                  callback(null, 0)
              }
          } catch (error) {
              console.log(error)
              callback(null, 'error')
          }
      }
      

      【讨论】:

      • 好吧,那行得通。我想知道的是为什么在本地节点上工作时不能在 lambda 上工作。
      • 你是怎么调用你的logActivityLog函数的?
      • 它的 aws lambda 处理程序
      • 你使用的是节点 6 还是节点 8?从节点 7.6.0 开始引入 async/await
      • 此外,如果发生错误,您应该使用不为空的东西作为第一个参数进行回调,例如callback('error occured')
      猜你喜欢
      • 2016-08-21
      • 2022-11-05
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 2020-06-10
      相关资源
      最近更新 更多