Javascript 在实际API上使用木偶演员

Javascript 在实际API上使用木偶演员,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,我很抱歉提出这么长的问题,我是node的新手,但我之前已经制作了一个CRUD API,包括身份验证和所有内容,我只需要了解如何将Puppeter集成到API中,所以让我开始: 这是我的项目结构: 木偶演员api 控制器-puppeter.controller.js 路线-puppeter.routes.js index.js 这是我的index.js文件: const puppeteer = require('puppeteer'); const express = require('expre

我很抱歉提出这么长的问题,我是node的新手,但我之前已经制作了一个CRUD API,包括身份验证和所有内容,我只需要了解如何将Puppeter集成到API中,所以让我开始:

这是我的项目结构:

木偶演员api

控制器-puppeter.controller.js 路线-puppeter.routes.js index.js 这是我的index.js文件:

const puppeteer = require('puppeteer');
const express = require('express');
const booking = require('./routes/puppeteer.routes')

const app = express();

app.use('/booking', booking);

let port = 8080;

app.listen(port, () => {
    console.log('Server is running on https://localhost:8080/');
});
puppeter.routes.js:

const express = require('express');
const router = express.Router();

const puppeteer_controller = require('../controllers/puppeteer.controller');

router.get('/', puppeteer_controller.get_booking);

module.exports = router;
puppeter.controller.js:

const puppeteer = require('puppeteer');

exports.get_booking = (req, res, next) => {
  res.json = (async function main() {
    try {

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

      await page.goto('https://www.booking.com/searchresults.es-ar.html?label=gen173nr-1DCAEoggI46AdIM1gEaAyIAQGYASy4ARfIAQzYAQPoAQGIAgGoAgM&lang=es-ar&sid=bc11c3e819d105b3c501d0c7a501c718&sb=1&src=index&src_elem=sb&error_url=https%3A%2F%2Fwww.booking.com%2Findex.es-ar.html%3Flabel%3Dgen173nr-1DCAEoggI46AdIM1gEaAyIAQGYASy4ARfIAQzYAQPoAQGIAgGoAgM%3Bsid%3Dbc11c3e819d105b3c501d0c7a501c718%3Bsb_price_type%3Dtotal%26%3B&ss=El+Bols%C3%B3n%2C+R%C3%ADo+Negro%2C+Argentina&is_ski_area=&checkin_year=&checkin_month=&checkout_year=&checkout_month=&no_rooms=1&group_adults=2&group_children=0&b_h4u_keep_filters=&from_sf=1&ss_raw=el+bols&ac_position=0&ac_langcode=es&ac_click_type=b&dest_id=-985282&dest_type=city&place_id_lat=-41.964452&place_id_lon=-71.532732&search_pageview_id=06d48fb6823e00e9&search_selected=true&search_pageview_id=06d48fb6823e00e9&ac_suggestion_list_length=5&ac_suggestion_theme_list_length=0');
      await page.waitForSelector('.sr_item');
      page.on('console', consoleObj => console.log(consoleObj.text()));

      console.log('Retrieving hotels data');

      const hoteles = page.evaluate(() => {
        let hoteles = [];
        let x = document.getElementsByClassName('sr_item');
        hoteles.push(x);

        let navigation = document.getElementsByClassName('sr_pagination_item');

        for (const nav of navigation) {
          nav.click();
          hoteles.push(document.getElementsByClassName('sr_item'));
        }

        console.log('Finished looping through');

        return hoteles;
      });

    } catch(e) {
      console.log('error', e);
    }
  })();
};
所以,我想要的是能够从我的应用程序发送GET请求,并从我的API获得预订酒店列表的响应,这只是一个个人项目,问题是,我使用邮递员发送GET请求,但我没有得到任何响应,所以我想知道我做错了什么,应该遵循什么方向,如果有人能为我指出正确的方向,我将不胜感激

块{}立即运行代码,而不是根据请求运行代码。 是一个函数,您不应该重新分配它。 相反,将函数移到其他位置,并按如下方式调用它

async function scraper() {
    try {

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

      await page.goto('https://www.booking.com/searchresults.es-ar.html?label=gen173nr-1DCAEoggI46AdIM1gEaAyIAQGYASy4ARfIAQzYAQPoAQGIAgGoAgM&lang=es-ar&sid=bc11c3e819d105b3c501d0c7a501c718&sb=1&src=index&src_elem=sb&error_url=https%3A%2F%2Fwww.booking.com%2Findex.es-ar.html%3Flabel%3Dgen173nr-1DCAEoggI46AdIM1gEaAyIAQGYASy4ARfIAQzYAQPoAQGIAgGoAgM%3Bsid%3Dbc11c3e819d105b3c501d0c7a501c718%3Bsb_price_type%3Dtotal%26%3B&ss=El+Bols%C3%B3n%2C+R%C3%ADo+Negro%2C+Argentina&is_ski_area=&checkin_year=&checkin_month=&checkout_year=&checkout_month=&no_rooms=1&group_adults=2&group_children=0&b_h4u_keep_filters=&from_sf=1&ss_raw=el+bols&ac_position=0&ac_langcode=es&ac_click_type=b&dest_id=-985282&dest_type=city&place_id_lat=-41.964452&place_id_lon=-71.532732&search_pageview_id=06d48fb6823e00e9&search_selected=true&search_pageview_id=06d48fb6823e00e9&ac_suggestion_list_length=5&ac_suggestion_theme_list_length=0');
      await page.waitForSelector('.sr_item');
      page.on('console', consoleObj => console.log(consoleObj.text()));

      console.log('Retrieving hotels data');

      const hoteles = page.evaluate(() => {
        let hoteles = [];
        let x = document.getElementsByClassName('sr_item');
        hoteles.push(x);

        let navigation = document.getElementsByClassName('sr_pagination_item');

        for (const nav of navigation) {
          nav.click();
          hoteles.push(document.getElementsByClassName('sr_item'));
        }

        console.log('Finished looping through');

        return hoteles;
      });

    } catch(e) {
      console.log('error', e);
    }
  }

// Call the scraper
exports.get_booking = async (req, res, next) => {
  const scraperData = await scraper();
  res.json(scraperData)
}
它将使控制器成为承诺并返回JSON数据