【问题标题】:For loop - SyntaxError: await is only valid in async functionFor 循环 - SyntaxError: await 仅在异步函数中有效
【发布时间】:2024-04-19 20:05:02
【问题描述】:

我对 NodeJS 还很陌生,我正在努力弄清楚这里发生了什么以及为什么我会收到错误:“SyntaxError: await is only valid in async function” for await doScrape(results[i].productUrl);

我查看了其他示例,但仍然无法发现问题所在。非常感谢任何帮助。谢谢。

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);
    };
  });
};

【问题讨论】:

  • 等待doScrape(results[i].productUrl);必须在异步函数中调用

标签: node.js aws-lambda async-await


【解决方案1】:

最好不要将“then”与“async/await”结合使用。编写该代码的更正确的方法是这样的:

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

【讨论】:

  • 谢谢。那讲得通!非常感谢。
【解决方案2】:

您正在使用没有异步的等待。在您的代码末尾。

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

替换为

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);
    };
  });

【讨论】:

    【解决方案3】:

    你必须在函数上添加异步。

    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);
        };
      });
    };
    

    【讨论】: