2016-10-25 74 views
0

我想在AWS Lambda上運行Nightmare JS,但是我的函數總是返回null,並且似乎沒有運行任何異步代碼。這裏是我的代碼:AWS上的承諾Lambda函數不解決/返回 - Nightmare 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,雖然這個過程應該至少需要幾秒鐘,該功能一般在100毫秒左右結束。前兩個控制檯日誌(大於return nightmare.goto...)由Lambda註冊,但後來的日誌不是。

有什麼我做錯了嗎?

+0

context.success不是一個nodejs函數,你的意思是context.succeed? –

+0

也值得一提;一旦你調用context.succeed,該方法將返回並且後續行將不會被執行。 –

+0

好的,謝謝你。是的,我的意思是背景成功。但是,似乎lambda甚至沒有越過'return nightmare.goto(...)',所以我不確定這是導致問題的原因。 – otajor

回答

0

這是不工作的原因是,夢魘需要各種網絡驅動程序才能運行,這是不存在的Lambda,並據我所知不能安裝。

當我將函數代碼上傳到Lambda時,我綁定了我的node_modules,但這還不夠。

有一個long thread on the Nightmare repo here討論如何在Linux上無惡意地運行Nightmare,但這需要您通過apt-get安裝各種依賴關係,據我所知在Lambda上是不可能的。

如果您在未來找到方法,請確保留下一個答案!

0

我想你只看到一條日誌語句的主要原因是exists的計算結果爲false(或者JavaScript認爲是假的任何其他值)。我基於這樣的假設:else執行路徑由簡單的return語句組成,而不是使用lambda callback函數(或者如果使用舊版本,則爲context.succeedcontext.fail)。不執行callback可能導致Lambda函數在完成(或寫入日誌)之前終止。

要在實踐中驗證這一點,請更改最後一個return語句

callback(null, 'not present`) 

,表明LAMBDA執行成功,或

​​

,如果你認爲這是一個lambda錯誤。

也請考慮到成功結果的then部分更新到像

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

欲瞭解更多信息,請閱讀AWS文檔的Using the Callback Parameter款lambda函數處理程序的。

+0

你說得對,我錯誤地使用了回調。但是,我不認爲你的解釋是正確的 - 我也沒有看到'if(exists){..}'上面的行上的console.log(),它應該在所有情況下運行。 似乎有一個噩夢承諾鏈沒有記錄或投入Lambda環境的問題。 – otajor

+0

剛剛做出了您所建議的更改,但沒有幫助 - 仍然返回null。 – otajor