2013-06-13 4 views
3

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

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

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

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

ответ

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){ 
    ... 
    } 
}); 
+0

В вашем примере, как передать аргументы командной строки в phantom.create()? например - load-images = no – codecowboy

+0

@codecowboy - sry Я не узнал ваш комментарий. К сожалению, у меня нет ответа. Но я думаю, вы должны проверить phantomjs api ... – awenkhh

+1

@codecowboy, 'phantom.create ('- load-images = no', {port: freeport}, function (ph) {...});' – toriningen

2

Вы должны быть в состоянии пройти в номер порта каждый раз, когда вы звоните создать:

var phantom = require('phantom'); 
phantom.create(null, null, function(ph){ 

}, null, 11111); 

Вы можете использовать счетчик, чтобы убедиться, что он по-другому каждый раз, когда вы начинаете phantomjs-узел.

Если вы начинаете новый процесс каждый раз, и вы не можете поделиться счетчик, то вы можете использовать сканер портов, чтобы найти свободный порт:

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

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

Спасибо, но как я мог разделить счетчик между различными запросами? Кроме того, ваш синтаксис не работает (typeError: bad argument) – Rayjax

+0

Вы используете coffeescript или простой javascript? Отправьте соответствующую часть своего кода, где вы создаете фантомный объект, и я его обновлю. – AndyD

+0

Вы запускаете несколько процессов узла? – AndyD

Смежные вопросы