【发布时间】: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