0

I'm fairly new to NodeJS and I'm struggling a bit to get my head around what's happening here and why I'm getting the error: "SyntaxError: await is only valid in async function" for await doScrape(results[i].productUrl);

I've looked at other examples but still can't spot what's wrong. Any help greatly appreciated. Thanks.

const mysql = require('mysql');
const axios = require('axios');

async function doScrape(url) {
  try {
    console.log('scraping');
    const response = await axios.get('https://###########.com/dev?url=' + url);
    console.log(response.status);
    console.log(response);
  } catch (error) {
    console.error(error);
  }
}

module.exports.dailyScraperScheduler = async (event) => {

  var con = mysql.createConnection({
    host: "#####",
    user: "#####",
    password: "#####",
    database: "####"
  });

  let sql = 'SELECT productUrl FROM ######### ppw INNER JOIN products \
             p ON p.productId = ppw.productId WHERE IFNULL(ppw.lastUpdated,CURDATE() \
             - INTERVAL 1 DAY) < CURDATE()' 

  let getProducts = async (sql, params,results) => {
    return new Promise((resolve, reject) => {
        con.connect((err, connection) => {
            con.query(sql, params, (err, results) => {
                if (err){
                    reject(err);
                }
                resolve(results);
            });
        });
    });
  };
  
  await getProducts(sql)
  .then(function (results) {
    for (var i = 0; i < results.length; i++) {
      console.log(results[i].productUrl);
      await doScrape(results[i].productUrl);
    };
  });
};
1
  • await doScrape(results[i].productUrl); must be called inside an async function Commented Sep 24, 2021 at 10:34

3 Answers 3

2

It's better not to combine "then" with "async/await". The more proper way to write that code is like this:

const results = await getProducts(SQL);
  
for (var i = 0; i < results.length; i++) {
   console.log(results[i].productUrl);
   await doScrape(results[i].productUrl);
};
  
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks. That makes sense! Much appreciated.
2

you are using await without the async. in the end of your code.

await getProducts(sql)
  .then(function (results) {
    for (var i = 0; i < results.length; i++) {
      console.log(results[i].productUrl);
      await doScrape(results[i].productUrl);
    };
  });

replace by

await getProducts(sql)
  .then(async function (results) {
    for (var i = 0; i < results.length; i++) {
      console.log(results[i].productUrl);
      await doScrape(results[i].productUrl);
    };
  });

Comments

0

You must need to add async on the function.

const mysql = require('mysql');
const axios = require('axios');

async function doScrape(url) {
  try {
    console.log('scraping');
    const response = await axios.get('https://###########.com/dev?url=' + url);
    console.log(response.status);
    console.log(response);
  } catch (error) {
    console.error(error);
  }
}

module.exports.dailyScraperScheduler = async (event) => {

  var con = mysql.createConnection({
    host: "#####",
    user: "#####",
    password: "#####",
    database: "####"
  });

  let sql = 'SELECT productUrl FROM ######### ppw INNER JOIN products \
             p ON p.productId = ppw.productId WHERE IFNULL(ppw.lastUpdated,CURDATE() \
             - INTERVAL 1 DAY) < CURDATE()' 

  let getProducts = async (sql, params,results) => {
    return new Promise((resolve, reject) => {
        con.connect((err, connection) => {
            con.query(sql, params, (err, results) => {
                if (err){
                    reject(err);
                }
                resolve(results);
            });
        });
    });
  };
  
  await getProducts(sql)
  .then(async function (results) {
    for (var i = 0; i < results.length; i++) {
      console.log(results[i].productUrl);
      await doScrape(results[i].productUrl);
    };
  });
};

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.