微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Bull,Puppeteer,NodeJS和Express进行报废作业

如何解决使用Bull,Puppeteer,NodeJS和Express进行报废作业

我最近在Heroku上建立了一个平台来托管Puppeteer剪贴脚本(Express,Node JS)。在脚本开始花费越来越长的时间之前,它一直很棒。对于Heroku的documentations,任何超过30秒的请求都会使请求超时,并且失败。

解决此问题的方法是使用Redis服务器(特别是使用npm模块Bull)。

我之前从未听说过排队,所以这对我自己是一个学习的机会。

下面是我当前的代码(有效)。

我将彻底帮助您完成该过程:

  1. 服务器从客户端获取POST请求,要求它运行存储在数据库中的此脚本:
router.post(
  "/get-data/:id",// route
  ensureAuth,// ensure the person making the request is allowed to make the request in the first place
  fsController.createFile,// creates a .js file where the script will be copied to
  scrapperController.getData,// runs the function in the newly created .js file
  csvController.buildCSVAndDeliver // adds that data to a csv file and downloads it
);
  1. 创建文件,并将数据库中的代码复制到该文件
const Script = require("../models/Script");
const fs = require("fs");

exports.createFile = async (req,res,next) => {
  try {
    const script = await Script.findById({ _id: req.params.id });
    let filename = `./scrapper/${script._id}.js`;

    // While loop to check if file exists and to append a digit if it does.
    let counter = 0;
    while (fs.existsSync(filename)) {
      filename = `./scrapper/${script._id}${counter}.js`;
      counter++;
    }

    fs.writeFileSync(filename,script.script);
    req.filename = filename;
    next();
  } catch (error) {
    fs.unlink(filename);
    res.send(error,"Please Try Again");
    res.redirect('/dashboard')
  }
};
  1. scrapperController接收该文件并执行
const fs = require("fs");

exports.getData = async (req,next) => {
  try {
    let scrapper = require(`.${req.filename}`);
    const response = await scrapper(req.body);
    req.response = response;
    fs.unlinkSync(req.filename);
    next();
  } catch (error) {
    res.send(error,"Please Try Again");
    fs.unlinkSync(req.filename);
  }
};
  1. 最后,下载了CSV文件
const fs = require("fs");
const { Parser } = require("json2csv");

exports.buildCSVAndDeliver = async (req,res) => {
  let csvFile = `./csv/${req.params.id}.csv`;

  try {
    const parser = new Parser();
    const csv = parser.parse(req.response);
    fs.writeFileSync(csvFile,csv);
    res.download(csvFile,function () {
      fs.unlinkSync(csvFile);
    });
  } catch (error) {
    console.log(error);
  }
}

现在您知道该过程了,该在哪里添加排队代码?甚至可以使用这种代码结构吗?

谢谢,如果您需要我的其他信息,请随时询问。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。