如何组合两个需要监听端口的Express模块​​?

我试图创build一个网站刮板,用户input一个URL到表单中,当他们提交时,刮板获取URL,然后返回有关我指定的URL的数据。

我的主要app.js文件是:

// Dependencies var express = require('express'); var path = require('path'); var fs = require('fs'); // Custom Libraries - ./ signals to node not to look in the node_modules directory var scraper = require('./scraper'); // App.js Variables var app = express(); var viewsPath = path.join(__dirname, '/app/views'); app.use(express.static(__dirname + '/app/public')); // set the port - 3000 app.set('port', process.env.PORT || 3000); // Form handling app.use(require('body-parser').urlencoded({ extended:true })); app.get('/the_test'); // Writes the domain entered in the form to app/data/domain.txt app.post('/process', function(request, response){ var domain = request.body.domain; fs.writeFile('app/data/domain.txt', domain, function (err) { if (err) return console.log(err); console.log('Your domain has been saved!');; }); response.redirect(303, '/results'); }); // Routes require var routes = require('./routes'); app.use('/', routes); app.use('/results', routes); app.listen(app.get('port'), function(){ console.log('Express started on http://localhost:' + app.get('port') + '; press Ctrl-C to terminate.'); }); 

我的刮板文件是:

 var express = require('express'); var fs = require('fs'); var request = require('request'); var cheerio = require('cheerio'); var scraper = express(); // Scrape the url that was posted scraper.get('/scrape', function(req, res){ // Scrape this var url = fs.readFileSync('./app/data/domain.txt', 'utf8'); request(url, function(error, response, html){ if(!error){ var $ = cheerio.load(html); var header; var json = { header : ""}; $('.hero-message').filter(function(){ var data = $(this); header = data.children().first().text(); json.header = header; }); } else { console.log(error); } fs.writeFile('./app/data/results.json', JSON.stringify(json, null, 4), function(err){ console.log('File successfully written! - Check your project directory for the output.json file'); }); res.send('Check your console!') }); }); scraper.listen(4000); console.log('Magic happens on port 4000'); exports = module.exports = scraper; 

当我到localhost:3000时,用户可以inputURL并点击提交,他们被redirect到localhost:3000 / results,并且URL被logging在data / domain.txt中。

当我到localhost:4000 / scrape时,scraper激活,从domain.txt中抓取域并将其擦除。

我的问题是我怎样才能使这一个stream体程序和/或如何激活刮刀自动而不是去本地主机:4000 /刮每次? 我对Node.js和Express很新,意识到这是很多难看的代码。

任何提示将非常感谢。

你不需要为你正在做的事情保留两个单独的过程。 你可以做的是移动刮刀行动

 scrapper.get("/scrape", function (req, res) { // code }); 

对于主app.js文件并提供端口3000所有内容,请确保在main中包含所有来自scraper的依赖关系。 此时,您可能想了解如何使用节点的模块系统来保持代码分离和组织。

根据您的刮取过程需要多长时间,您可以执行以下操作之一:

  • 更改process动作以执行scrape动作目前所做的工作,因此将域写入文件,然后转到其他url以从该文件中读取并启动进程,即可捕获域并将其提供给刮刀马上。
  • 如果刮刀需要很长时间,并且想要自动开始刮刮作业,则不希望它阻止应用程序或在请求期间抛出超时。 你应该考虑实现一个工作队列机制。 有很多方法可以做到这一点,正确的解决scheme很大程度上取决于应用程序的预期用例。