wake-up-neo.com

Async/Await mit Request-Promise gibt Undefined zurück

Ich habe zwei Dateien. server.js und scrape.js, hier sind die aktuellen Codeausschnitte.

server.js:

const scrape = require("./scrape");

async function start() {
    const response = await scrape.start();
    console.log(response);
}

start();

und scrape.js:

const cheerio = require("cheerio");
const request = require("request-promise");

go = async () => {

const options = {
  uri: "http://www.somewebsite.com/something",
  transform: function(body) {
    return cheerio.load(body);
  }
};

request(options)
  .then($ => {
    let scrapeTitleArray = [];
    $(".some-class-in-html").each(function(i, obj) {
      const data = $(this)
        .text()
        .trim();
      scrapeTitleArray.Push(data);
    });
    return scrapeTitleArray;
  })
  .catch(err => {
    console.log(err);
  });
};

module.exports = {
  start: go
};

Wenn ich server.js hoch drehe, kehre ich undefined in die Konsole.log (Antwort) zurück. Wenn ich tatsächlich das Array zurückgeben möchte, zu dem ich gedrängt habe, können Sie sehen, wo ich falsch liege?

6
razki

Sie müssen return etwas von Ihrer async-Funktion (eine Rückkehr in eine dann nicht von der Hauptfunktion zurück). Entweder ein Versprechen oder etwas, das Sie await- __ed.

Vergewissern Sie sich außerdem, dass Sie Ihre Variable go deklarieren, um ein Austreten in den globalen Bereich zu vermeiden. 

const go = async () => {

  const options = {
    uri: "http://www.somewebsite.com/something",
    transform: function(body) {
      return cheerio.load(body);
    }
  };

  return request(options)
    .then($ => {
      let scrapeTitleArray = [];
      $(".some-class-in-html").each(function(i, obj) {
        const data = $(this)
          .text()
          .trim();
        scrapeTitleArray.Push(data);
      });
      return scrapeTitleArray;
    })
    .catch(err => {
      console.log(err);
    });
};

Da Sie eine async-Funktion verwenden, möchten Sie möglicherweise auch die await-Syntax nutzen.

const go = async () => {

  const options = {
    uri: "http://www.somewebsite.com/something",
    transform: function(body) {
      return cheerio.load(body);
    }
  };

  try {
    const $ = await request(options);
    $(".some-class-in-html").each(function(i, obj) {
      const data = $(this)
        .text()
        .trim();
      scrapeTitleArray.Push(data);
    });
    return scrapeTitleArray;
  }
  catch (err) {
    console.log(err);
  }
};
11

Ich glaube, dass Ihre go-Funktion keinen Wert zurückgibt.

Sie rufen request(options).then(...) an, aber was aus diesem Versprechen folgt, wird niemals von go zurückgegeben. Ich empfehle Ihnen, eine return-Anweisung hinzuzufügen:

go = async () => {

  const options = {
    uri: "http://www.somewebsite.com/something",
    transform: function(body) {
      return cheerio.load(body);
    }
  };

  // The only difference is that it says "return" here:
  return request(options)
    .then($ => {
      let scrapeTitleArray = [];
      $(".some-class-in-html").each(function(i, obj) {
        const data = $(this)
          .text()
          .trim();
        scrapeTitleArray.Push(data);
      });
      return scrapeTitleArray;
    })
    .catch(err => {
      console.log(err);
    });
};
0
Gershom Maes