NodeJS - 访问外部进程时如何处理“侦听EADDRINUSE”

时间:2013-06-13 14:35:08

标签: node.js concurrency pdf-generation phantomjs

我使用phantomJS打印PDF,使用phantomjs-node模块。它运行良好但是当我尝试一次创建多个文件时,它会抛出一个未处理的错误" Listen EADDRINUSE。

我认为这是因为模块使用了phantomJS,这是一个外部进程,它不能多次将它绑定到同一个端口?

无论如何,我无法捕捉到这个错误,我想至少通过避免服务器崩溃来解决这个问题。 我想过使用" global"变量,如一个锁定器,以阻止并发呼叫,直到当前的呼叫结束。

有关如何实现该解决方案或任何其他解决方案的想法吗?

2 个答案:

答案 0 :(得分:2)

每次调用create:

时,都应该能够传入一个端口号
var phantom = require('phantom');
phantom.create(null, null, function(ph){

},  null, 11111);

然后,您可以使用计数器确保每次启动phantomjs-node时它都不同。

如果您每次都开始新流程并且无法共享计数器,那么您可以使用portscanner查找空闲端口:

var portscanner = require('portscanner');
var phantom = require('phantom');

portscanner.findAPortNotInUse(40000, 60000, 'localhost', function(err, freeport) {
  phantom.create(null, null, function(ph){
    ...
  }
},  null, freeport);

答案 1 :(得分:2)

来自@AndyD的代码不正确imho。见

中的第45-54行

https://github.com/sgentle/phantomjs-node/blob/master/phantom.coffee

所以示例应该是

var portscanner = require('portscanner');
var phantom = require('phantom');

portscanner.findAPortNotInUse(40000, 60000, 'localhost', function(err, freeport) {
  phantom.create({'port': freeport}, function(ph){
    ...
  }
});