2016-10-25 6 views
0

Nightmare JSをAWS Lambdaで実行しようとしていますが、関数が常にnullを返し、非同期コードを実行していないようです。AWS Lambda関数の約束が解決されない - 戻り値 - ナイトメアJS

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' 
     } 
    }) 
} 

この関数は常にnullを返しますが、このプロセスは少なくとも2秒かかるはずですが、関数は通常約100msで終了します。最初の2つのコンソールログ(上記のreturn nightmare.goto...)はLambdaによって登録されますが、後のログは登録されません。

私が間違っていることはありますか?

+0

context.successはnodejs関数ではありません。context.succeedを意味しましたか? –

+0

も言及価値があります。 context.succeedを呼び出すと、メソッドは戻り、後続の行は実行されません。 –

+0

OKありがとうございます。はい、私は文脈の成功を意味しました。しかし、lambdaが過去の 'return nightmare.goto(...)'を過ぎていないように見えるので、これが問題を引き起こしているかどうかはわかりません。 – otajor

答えて

0

これがうまくいかない理由は、ナイトメアにはラムダにはない様々なウェブドライバが必要であり、私が知る限りインストールできないということです。

機能コードをラムダにアップロードしたときにnode_modulesをバンドルしていましたが、これでは不十分です。

ナイトメアをLinuxで無人で実行する方法についてはlong thread on the Nightmare repo hereがありますが、これにはラムダでは不可能であると認識されているapt-getでさまざまな依存関係をインストールする必要があります。

将来的に方法を見つけたら、お答えください。

0

私は、existsfalse(またはJavaScriptが偽であるとみなす他の値)と評価するという理由だけで、1つのログステートメントが表示される主な理由があると思います。私は、実行のelseパスが、Lambda callback関数(旧バージョンを使用する場合はcontext.succeedまたはcontext.fail)を使用するのではなく、単純なreturn文で構成されているという事実に基づいています。 callbackを実行しないと、Lambda関数が完了する前に終了する(またはログを書き込む)可能性があります。あなたは、これはラムダ誤りであることを考慮すれば、実際にこれを確認するには

、ラムダの実行が成功したことを示すために

callback(null, 'not present`) 

に最後のreturn文を変更してください、または

​​

も詳細については、AWSのドキュメントでラムダ関数ハンドラのUsing the Callback Parameter段落を読んでください

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

ような何かに成功した結果のthen一部を更新することを検討してください。

+0

あなたが正しいです、私は間違ったコールバックを使用していました。しかし、私はあなたの説明が正しいとは思わない - 私はまた、 'if(exists){..} 'の上の行にconsole.log()が表示されないようにしています。 ラムダ環境でログインしたり投げたりしていない悪夢の約束チェーンに問題があるようです。 – otajor

+0

あなたが提案した変更をしただけで、役に立たなかった - まだnullを返す。 – otajor

関連する問題