AWS Lambda 函数上的承诺不 resolve/return - Nightmare JS

Promises on AWS Lambda function do not resolve/return - Nightmare JS

我正在尝试 运行 AWS Lambda 上的 Nightmare JS,但我的函数总是 returns null 并且似乎没有 运行ning 我的任何异步代码。这是我的代码:

exports.handler = (event, context, callback) => {
  console.log('starting....')
  const Nightmare = require('nightmare')
  const nightmare = Nightmare()
  console.log('created Nightmare: ', nightmare)
  return nightmare
    .goto('https://www.myurl.com')
    .exists('[data-selector-element]')
    .then((exists) => {
      console.log('element exists: ', exists)
      if (exists) {
        return nightmare.click('[data-selector-element]')
          .wait(200)
          .evaluate(() => {
            const title = document.querySelector('h1.header')
            return { title }
          })
          .then((res) => {
            context.success(res)
            console.log('success:', res)
            callback('success: ')
            return res
          })
      } else {
        return 'not present'
      }
    })
}

该函数始终 returns null,尽管此过程至少需要几秒钟,但该函数通常会在 100 毫秒左右结束。前两个控制台日志(return nightmare.goto...以上)由Lambda注册,但后面的日志不是。

我做错了什么吗?

我猜你只看到一个日志语句的主要原因是 exists 的计算结果为 false(或 JavaScript 认为为假的任何其他值)。我的假设基于这样一个事实,即 else 执行路径由一个简单的 return 语句组成,而不是使用 Lambda callback 函数(或 context.succeedcontext.fail 如果您使用旧版本)。不执行 callback 可能会导致 Lambda 函数在完成(或写入日志)之前终止。

为了在实践中验证这一点,请将最后一个 return 语句更改为

callback(null, 'not present`)

表示 Lambda 执行成功,或

callback('not present`)

如果您认为这是 Lambda 错误。

还请考虑将成功结果的 then 部分更新为类似

的内容
.then((res) => {
    console.log('success:', res)
    callback(null, 'success: ')
})

有关详细信息,请阅读 AWS 文档中 Lambda 函数处理程序的 Using the Callback Parameter 段落。

TL;DR - 你不能 运行 Lambda 上的噩梦,你只能 运行 在可以安装额外依赖项(例如网络驱动程序)的常规服务器上。

这是行不通的,因为 Nightmare 需要各种网络驱动程序才能 运行,这些驱动程序在 Lambda 上不存在,据我所知无法在 Lambda 上安装。

有一个 long thread on the Nightmare repo here 讨论如何在 Linux 上无头地 运行 噩梦,但这需要你安装各种依赖项,据我所知这是不可能的在 Lambda 上。

如果以后有办法请务必留下答案!