NodeJS - 访问外部进程时如何处理"listen EADDRINUSE"



我使用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时它都是不同的。

如果你每次都启动一个新进程,你不能共享一个计数器,那么你可以使用端口扫描器找到一个空闲端口:

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

最新更新