Node.js 创建新实例时停止节点simplecrawler实例(使其行为类似于单例)

Node.js 创建新实例时停止节点simplecrawler实例(使其行为类似于单例),node.js,express,Node.js,Express,海洛,各位 我正在做一个刮刀,它使用。一切运行正常,但我不知道如何在创建新实例时停止一个实例(我希望一次只运行一个实例)。我使用的是express,所有的抓取逻辑都在一条路线上。为了立即取消爬网,我需要停止节点进程并再次运行应用程序 下面是与运行爬虫程序有关的代码部分(注意:我对代码进行了一点简化,因此代码更短): 每个simplecrawler实例都有一个stop方法,可以调用该方法来防止爬虫发出任何进一步的请求(但是请求不会在飞行中停止) 我可能会将爬虫实例存储在路由处理程序之外的一个作用域

海洛,各位

我正在做一个刮刀,它使用。一切运行正常,但我不知道如何在创建新实例时停止一个实例(我希望一次只运行一个实例)。我使用的是express,所有的抓取逻辑都在一条路线上。为了立即取消爬网,我需要停止节点进程并再次运行应用程序

下面是与运行爬虫程序有关的代码部分(注意:我对代码进行了一点简化,因此代码更短):


每个simplecrawler实例都有一个
stop
方法,可以调用该方法来防止爬虫发出任何进一步的请求(但是请求不会在飞行中停止)

我可能会将爬虫实例存储在路由处理程序之外的一个作用域中,检查它是否首先在路由处理程序中定义,在这种情况下,调用
stop
方法,然后构造一个新的scraper

我删去了您代码中的很多内容,但我的想法是这样的:

module.exports = function(socket) {
  var express = require('express');
  var router = express.Router();
  var Crawler = requrie('simplecrawler');

  var crawler;

  router.post('/', function(req, res, next) {
    // Check if URL exist
    request(url.href, function (error, response, body) {
      if (!error && response.statusCode == 200) {

        // Stop any crawler that's already running
        if (crawler instanceof Crawler) {
            crawler.stop();
        }

        // Crawler configuration
        crawler = new Crawler(url.host);
        crawler.initialPort = 80;
        crawler.initialPath = url.pathname;

        // Run the crawler
        crawler.start();

        // Execute for each URL, on fetchcomplete
        crawler.on('fetchcomplete', function(item, responseBuffer, response) {
            // [Do stuff with the scraped page]
        });

        // Completed crawling. Now let's get to work!
        crawler.on('complete', function() {
            // [Get all scraped pages and do something with them]
        });

      } else if(error) {
        console.log(error);
      }
    });
  });

  return router;
}

每个simplecrawler实例都有一个
stop
方法,可以调用该方法来防止爬虫发出任何进一步的请求(但是请求不会在飞行中停止)

我可能会将爬虫实例存储在路由处理程序之外的一个作用域中,检查它是否首先在路由处理程序中定义,在这种情况下,调用
stop
方法,然后构造一个新的scraper

我删去了您代码中的很多内容,但我的想法是这样的:

module.exports = function(socket) {
  var express = require('express');
  var router = express.Router();
  var Crawler = requrie('simplecrawler');

  var crawler;

  router.post('/', function(req, res, next) {
    // Check if URL exist
    request(url.href, function (error, response, body) {
      if (!error && response.statusCode == 200) {

        // Stop any crawler that's already running
        if (crawler instanceof Crawler) {
            crawler.stop();
        }

        // Crawler configuration
        crawler = new Crawler(url.host);
        crawler.initialPort = 80;
        crawler.initialPath = url.pathname;

        // Run the crawler
        crawler.start();

        // Execute for each URL, on fetchcomplete
        crawler.on('fetchcomplete', function(item, responseBuffer, response) {
            // [Do stuff with the scraped page]
        });

        // Completed crawling. Now let's get to work!
        crawler.on('complete', function() {
            // [Get all scraped pages and do something with them]
        });

      } else if(error) {
        console.log(error);
      }
    });
  });

  return router;
}

非常感谢你!这正是我需要的!我唯一没有想到的是从路由处理程序中获取爬虫实例!非常感谢你的回答!非常感谢你!这正是我需要的!我唯一没有想到的是从路由处理程序中获取爬虫实例!非常感谢你的回答!