【问题标题】:Add Cron Job to Function (node.js, express, react, mongodb)将 Cron 作业添加到函数(node.js、express、react、mongodb)
【发布时间】:2022-01-09 13:59:07
【问题描述】:

你能帮我在我的应用程序中使用 cron 功能吗?我被它困住了(

这是我的“track.controller.js”和“server.js”与“multiTrack”功能。 multiTrack() 函数通过用户 URL 开始重新抓取过程,它是通过用户仪表板中的按钮手动启动的,但我想将 cron 作业添加到此函数(multiTrack)。 在 server.js 文件中导入“multiTrack”函数返回“req is not defined”... 谢谢你!

/-----------server.js------------/

const cron = require('node-cron');
const multiTrackfunc = require('./controllers/track.controller.js');

cron.schedule("*/60 * * * * *", () => {
  try {
    multiTrackfunc.multiTrack(req, res, next);
    console.log(`Re-crawling starts via cron`);
  }
  catch (err) {
    console.log(`${err} - in cron`);
  }
});

/-----------server.js------------/

/-----------track.controller.js------------/

const cron = require('node-cron')

exports.multiTrack = async (req, res, next) => {
  try {
    const { userId, createdTracks } = req.body;
    const trackIds = createdTracks.map((createdTrack) => createdTrack._id);

    const user = await User.findById(userId);
    if (!user) {
      return res.status(401).json({
        success: false,
        error: "User does not exist",
      });
    }

    try {
      // loop through each track START
      await new Promise((resolve, reject) => {
        createdTracks.forEach(async (createdTrack) => {
          const existingTrack = await Track.findById(createdTrack._id);
          if (!existingTrack) {
            reject();
          }
          
          // crawl Amazon product
          console.log(`${createdTrack.name} re-crawling starts`);
          const browser = await puppeteer.launch();
          const page = await browser.newPage();

          await page.goto(createdTrack.productUrl, {
            waitUntil: "networkidle2",
          });

          const crawledProduct = await page.evaluate(() => {
            let actualPrice = 0;

            const prepOurPrice = document.querySelector("span.woocommerce-Price-amount.amount").innerText;

            const image = document.querySelector(".woocommerce-product-gallery__image a img").src;
            const ourPrice = parseFloat(prepOurPrice.replace(/[^0-9\.-]+/g, ""));
            const salePrice = document.querySelector("#priceblock_saleprice");
            const dealPrice = document.querySelector("#priceblock_dealprice");

            ///parseFloat(actualPrice.replace(/[^0-9\.-]+/g, ""))

            if (ourPrice) {
              actualPrice = ourPrice;
            } else if (salePrice) {
              actualPrice = salePrice.innerText;
            } else if (dealPrice) {
              actualPrice = dealPrice.innerText;
            }

            return {
              image,
              actualPrice,
            };
          });
          console.log(`${createdTrack.name} re-crawling ends`);
          await browser.close();

          const { image, actualPrice } = crawledProduct;

          if (existingTrack.image !== image) {
            existingTrack.image = image;
            await existingTrack.save();
          }

          if (existingTrack.actualPrice !== actualPrice) {
            existingTrack.actualPrice = actualPrice;
            await existingTrack.save();
          }

          resolve();
        });
      });
      // loop through each track END
    } catch {
      return res.status(401).json({
        success: false,
        error: "Found invalid track id",
      });
    }

    const tracks = await Track.find({ _id: { $in: trackIds } });

    return res.status(201).json({
      success: true,
      data: tracks,
    });
  } catch (err) {
    console.log("crawling failed");
    return res.status(500).json({ error: err.message });
  }
};

/-----------track.controller.js------------/

更新

当我从

中删除“req, res, next”时
cron.schedule("*/5 * * * * *", () => {
  try {
    multiTrackfunc.multiTrack();
    console.log(`Re-crawling starts via cron`);
  }
  catch (err) {
    console.log(`${err} - in cron`);
  }
});

看起来像“multiTrack”启动,但有错误: 终端年表:

crawling failed
Re-crawling starts via cron
/Work/Scrapers/webtools-tracker/controllers/track.controller.js:258
return res.status(500).json({ error: err.message });

TypeError: Cannot read properties of undefined (reading 'status')
at Object.exports.multiTrack (/Work/Scrapers/webtools-tracker/controllers/track.controller.js:258:16)

【问题讨论】:

    标签: javascript node.js express async-await node-cron


    【解决方案1】:

    您可以使用setInterval

    在 Window 和 Worker 上提供的 setInterval() 方法 接口,重复调用函数或执行代码sn-p, 每次通话之间有固定的时间延迟。

    【讨论】:

    • 非常感谢!添加此代码后“setInterval(this.multiTrack, 10000);”在“track.controller.js”中的 multiTrack 函数之后。看起来像爬取开始,但返回以下错误: crawling failed [0] /Work/Scrapers/webtools-tracker/controllers/track.controller.js:258 [0] return res.status(500).json({ error: err 。信息 }); [0] ^ [0] [0] TypeError: Cannot read properties of undefined (reading 'status')
    猜你喜欢
    • 2022-01-01
    • 2012-10-24
    • 2012-08-20
    • 2012-02-08
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多