【问题标题】:Error: Evaluation failed: ReferenceError: res is not defined错误:评估失败:ReferenceError:未定义资源
【发布时间】:2019-08-24 16:40:55
【问题描述】:

我在使用 puppeteer 的节点中遇到了范围问题。我无法发送在 puppeteer 的评估对象中获得的内容,因为我得到: 错误:评估失败:ReferenceError:未定义资源 我需要帮助。

const express = require('express');
const path = require('path'); // NEW
const puppeteer = require('puppeteer');
const fs = require('fs');

const config = require('../src/config.js');
const app = express();
const port = process.env.PORT || 3006;
const DIST_DIR = path.join(__dirname, '../dist'); // NEW
const HTML_FILE = path.join(DIST_DIR, 'index.html'); // NEW

app.use(express.static(DIST_DIR)); // NEW
app.get('/api', (req, res) => {
  res.send(mockResponse);
});
app.get('/getapi', async (req, res) => {
  req.setTimeout(500000);

  var pal= req.query.palabra;
  function randomIntFromInterval(min, max) { // min and max included
    return Math.floor(Math.random() * (max - min + 1) + min);
  }

  const next_class = 'snByac';

      const browser = await puppeteer.launch({
      headless: false,
    });
      const page = await browser.newPage();

      await page.goto('https://adwords.google.com/ko/KeywordPlanner/Home?', {waitUntil: 'networkidle2'});
      await page.waitFor(randomIntFromInterval(10000,25000));
      await page.type('input[name=identifier]', config.mail);
      await page.click('span.' + next_class);
      await page.waitFor(randomIntFromInterval(20000,23000));
      await page.type('input[name=password]', config.password)
      await page.click('span.' + next_class)
      await page.waitFor(randomIntFromInterval(37000,45000));
      await page.click('[icon="arrow_forward"]')
      await page.waitFor(randomIntFromInterval(3800,6000));
      await page.type('[aria-autocomplete="list"]', pal)
      await page.waitFor(randomIntFromInterval(1400,2400));
      await page.keyboard.press('Enter');
      await page.waitFor(randomIntFromInterval(5000,14000));
      await page.keyboard.press('Enter');
      var hotelJson = {};
      await page.evaluate(() => {
      var hotelsElms = document.querySelectorAll('.keyword._ngcontent-vyt-82');
      hotelsElms.forEach((hotelelement) => {
       hotelJson.name = hotelelement.querySelector('span.keyword._ngcontent-vyt-82').innerText;
        });
      res.json(hotelJson);
});


        await browser.close();

});
app.get('/', (req, res) => {
 res.sendFile(HTML_FILE); // EDIT
});
app.listen(port, function () {
 console.log('App listening on port: ' + port);
});
//app.setTimeout(500000);

我也试过把“res.json (hotelJson);”在“评估”对象之外但返回一个空的json,就好像“hotelJson”无法在“评估”函数的范围内分配然后恢复为空,我试图用虚假数据填充它,它也返回空。

【问题讨论】:

    标签: javascript node.js express puppeteer


    【解决方案1】:

    Official document - 该方法返回一个 Promise,它解析为 pageFunction 的返回值。

    这意味着您可以在evaluate 函数的“外部”取回一个值。

    //...
    const result = await page.evaluate(() => {
        var hotelsElms = document.querySelectorAll('.keyword._ngcontent-vyt-82');
        var hotelJson = {};
        hotelsElms.forEach((hotelelement) => {
            hotelJson[name] = hotelelement.querySelector('span.keyword._ngcontent-vyt-82').innerText;
        });
        return hotelJson; // return value to "out site", assign `hotelJson` to `result`
    });
    
    // response the data to the client
    res.json(result);
    
    // ...
    

    【讨论】:

    【解决方案2】:

    据我了解,您无法从evaluate() 范围之外访问变量——至少在没有passing them explicitly 的情况下无法访问。您可以保持变量名称相同,而且您通常会这样做,但我更改了它们以说明发生了什么。

    app.get('/getapi', async(req, res) => {
        // …
        var hotelJson = {};
        await page.evaluate((argRes, argHotelJson) => {
            // …
            argRes.json(argHotelJson);
        }, res, hotelJson);
        // …
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多