NightmareJS(电子浏览器)兼容Firebase功能吗?

时间:2017-12-12 16:21:48

标签: javascript node.js firebase google-cloud-functions nightmare

我有一个应用程序,它接受纽约时报食谱网址,并将成分列表转换为购物待办事项列表。

因为“纽约时报”使用React,所有数据都不能通过标准抓取获得 - index.html大部分是空白的。我必须使用像NightmareJS这样的库,它使用Electron浏览器来完全构造DOM(包括Javascript),这样我就可以抓取构造的DOM来获取数据。

但这似乎不起作用。这是我在/functions/index.js文件中包含的代码:

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions')

// The Firebase Admin SDK to access the Firebase Realtime Database. 
const admin = require('firebase-admin')
admin.initializeApp(functions.config().firebase)

const Nightmare = require('nightmare')
const Actions = require('nightmare-react-utils').Actions

exports.listify = functions.https.onRequest((req, res) => {

  console.log("YOU ARE NOW INSIDE THE LISTIFY FUNCTION!")

  Nightmare.action(...Actions)
  const nightmare = new Nightmare({ show: false })
  const selector = 'ul.recipe-ingredients'
  const queryUrl = req.query.url
  nightmare
    .goto(queryUrl)
    .wait()
    .evaluate((selector) => {

      console.log("YOU ARE NOW INSIDE THE EVALUATE!")

      const recipeIngredientsObject = document.querySelector(selector).children
      const result = []

      const ingredientKeys = Object.keys(recipeIngredientsObject)
      ingredientKeys.forEach((key) => {
      const ingredientObject = recipeIngredientsObject[key]
      const quantityAndIngredient = ingredientObject.children
      result.push({
          "quantity": quantityAndIngredient[0].innerText,
          "ingredient": quantityAndIngredient[1].innerText
      })
    })
    return result
  }, selector)
})

当我从我的前端调用此函数时,我在Firebase日志中看到第一个控制台日志 - “你现在正处于LISTIFY FUNCTION中!” - 但我没有看到第二条消息:“你现在正在评估中!”

我可以不将NightmareJS与Firebase功能一起使用吗?

1 个答案:

答案 0 :(得分:0)

将不会出现console.log消息。运行evaluate时,该函数在无头浏览器的上下文中执行,因此不会登录到终端。

尝试类似......

.evaluate((selector) => {
    return document.querySelector(selector)
}, selector)
.end()
.then(console.log)

看它是否有效。