NodeJS — как обрабатывать прослушивание EADDRINUSE при доступе к внешнему процессу

Я использую phantomJS для печати PDF с модулем phantomjs-node. Он работает хорошо, но когда я пытаюсь создать несколько файлов одновременно, он выдает необработанную ошибку «Слушайте EADDRINUSE.

Я предполагаю, что это связано с тем, что модуль использует phantomJS, который является внешним процессом, и он не может привязать его к одному и тому же порту несколько раз?

Во всяком случае, я не могу поймать эту ошибку, и я хотел бы решить эту проблему, по крайней мере, избегая сбоя сервера, когда это происходит. Я подумал об использовании «глобальной» переменной, например, шкафчика, чтобы блокировать одновременные вызовы до тех пор, пока текущий не будет завершен.

Любая идея о том, как реализовать это или любое другое решение?


person Rayjax    schedule 13.06.2013    source источник


Ответы (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){
    ...
  }
});
person awenkhh    schedule 02.08.2013
comment
В вашем примере, как передать аргументы командной строки в phantom.create()? например --load-images=нет - person codecowboy; 03.12.2013
comment
@codecowboy - извините, я не узнал ваш комментарий. У меня нет ответа к сожалению. Но я думаю, что вы должны проверить API фантомов ... - person awenkhh; 19.04.2014
comment
@codecowboy, phantom.create('--load-images=no', {port: freeport}, function(ph) {...}); - person toriningen; 03.05.2014

Вы должны иметь возможность передавать номер порта каждый раз, когда вы вызываете 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);
person AndyD    schedule 13.06.2013
comment
Спасибо, но как я могу разделить счетчик между разными запросами? Кроме того, ваш синтаксис не работает (typeError: неверный аргумент) - person Rayjax; 14.06.2013
comment
вы используете coffeescript или обычный javascript? Опубликуйте соответствующую часть вашего кода, где вы создаете фантомный объект, и я обновлю его. - person AndyD; 14.06.2013
comment
вы запускаете несколько узловых процессов? - person AndyD; 14.06.2013