我正在使用 phantomJS 打印 PDF,带有 phantomjs-node 模块。它工作得很好,但是当我尝试一次创建多个文件时,它会抛出一个未处理的错误“Listen EADDRINUSE.
我认为这是因为该模块使用 phantomJS 这是一个外部进程,它不能多次绑定到同一个端口?
无论如何,我无法捕捉到这个错误,我想至少通过避免发生这种情况时服务器崩溃来解决这个问题。我想过使用“全局”变量,比如储物柜,以阻止并发调用,直到当前调用完成。
关于如何实现它或任何其他解决方案的任何想法?
我正在使用 phantomJS 打印 PDF,带有 phantomjs-node 模块。它工作得很好,但是当我尝试一次创建多个文件时,它会抛出一个未处理的错误“Listen EADDRINUSE.
我认为这是因为该模块使用 phantomJS 这是一个外部进程,它不能多次绑定到同一个端口?
无论如何,我无法捕捉到这个错误,我想至少通过避免发生这种情况时服务器崩溃来解决这个问题。我想过使用“全局”变量,比如储物柜,以阻止并发调用,直到当前调用完成。
关于如何实现它或任何其他解决方案的任何想法?
@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){
...
}
});
您应该能够在每次调用 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);