简体   繁体   English

异步 function 返回未定义

[英]async function return undefined

the function getQAfromAmazon(productID) return value in productInfo . function getQAfromAmazon(productID)productInfo中返回值。 but for this line:但对于这一行:

const product = await getQAfromAmazon(productID);
console.log("product is:" ,  product);

the result is: product is: undefined结果是: product is: undefined

how can I insert the result to product?如何将结果插入产品?

const express = require('express');
const app = express();
const puppeteer = require('puppeteer');
const fs = require('fs');

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*"); //for public api
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

app.use(express.urlencoded({ extended: false }));
app.use(express.json())
app.use(express.static('../client'));

app.post('/getQuestionsAndAnswers', async(req, res) => {
  console.log("req.body.productId", req.body.productId);

  let productID = req.body.productId;
  const product = await getQAfromAmazon(productID);
  console.log("product is:", product);
});

app.listen(3000);

async function getQAfromAmazon(productID) {
  puppeteer.launch({
      headless: true,
      slowMo: 250,
      args: ['--no-sandbox', '--disable-setuid-sandbox', '--window-size=1920,1080', '--user-agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3312.0 Safari/537.36"']
    })
    .then(async browser => {
      const page = await browser.newPage();
      console.log("go to page");

      await page.goto("https://www.amazon.com/ask/questions/asin/" + productID);
      console.log("waiting for selector body");

      await page.waitForSelector('body');

      var productInfo = await page.evaluate(() => {
        let questionsArray = [];
        let answersArray = [];

        console.log("waiting for selector question");

        let len = document.querySelectorAll("[id^='question']").length;
        console.log("len is: ", len);

        let str;
        let ans;

        for (let i = 1; i < len; i++) {
          let question = document.querySelectorAll("div.a-fixed-left-grid-col.a-col-right > a > span")[i - 1].innerText;
          console.log("question is: ", question);

          str = "#a-page > div.a-section.askQuestionListPage > div:nth-child(7) > div > div > div:nth-child(" + i + ") > div > div.a-fixed-left-grid-col.a-col-right > div.a-fixed-left-grid.a-spacing-base > div > div.a-fixed-left-grid-col.a-col-right > span:nth-child(3)";

          if (document.querySelector(str) == null) {
            ans = "no answer";
          } else {
            ans = document.querySelector(str).innerText;
          }

          questionsArray.push(question);
          answersArray.push(ans);
        };

        var product = {
          "questionsArray": questionsArray,
          "answersArray": answersArray
        };

        return product;
      });

      await browser.close();
      console.log("productInfo is:", productInfo);

      return productInfo;
    }).catch(function(error) {
      console.error(error);
    });
}

Your getQAfromAmazon() has no return values.您的getQAfromAmazon()没有返回值。 return productInfo; is called within puppeteer.launch(...).then(...) .puppeteer.launch(...).then(...)中调用。

Try something like this:尝试这样的事情:

...
async function getQAfromAmazon(productID) {
  return puppeteer.launch({
    ...

So that getQAfromAmazon will return the promise.这样getQAfromAmazon将返回 promise。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM