3

我正在使用 phantomJS 打印 PDF,带有 phantomjs-node 模块。它工作得很好,但是当我尝试一次创建多个文件时,它会抛出一个未处理的错误“Listen EADDRINUSE.

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

无论如何,我无法捕捉到这个错误,我想至少通过避免发生这种情况时服务器崩溃来解决这个问题。我想过使用“全局”变量,比如储物柜,以阻止并发调用,直到当前调用完成。

关于如何实现它或任何其他解决方案的任何想法?

4

2 回答 2

2

@AndyD 的代码不正确恕我直言。见第 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){
    ...
  }
});
于 2013-08-02T23:29:18.543 回答
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);
于 2013-06-13T22:02:37.033 回答