Задать вопрос

NodeJS+DNode+Php — ошибка Error: write EPIPE?

Доброго дня.


В очередной раз борюсь с непонятными моментами для меня в nodeJs. Сейчас столкнулся с ошибкой, которую опять же не могу решить самостоятельно и прошу помощи сообщества:


Пишу PHP приложение и решил некоторый функционал перенести на NodeJS в виду его производительности, гибкости и легкой масштабируемости.

Итак что есть:

— RPC Сервер на NodeJS. Связь с PHP организовал через модуль DNode который существует для обоих языков. Но PHP пока планирую использовать как клиент.


Итак NodeJS сторона:
require('epipebomb')()
require('./includes/array.js')
var dnode  = require('dnode')
var net = require('net')
var request = require('request')
var tidy = require('tidy2')
var util = require('util')
var dom = require('xmldom').DOMParser

var server = net.createServer(function (c) {
	var d = dnode({

	
		mul: function (requestUrl,fields,callback){
						request(requestUrl, function (error, response, body) {
						console.log('Fetch url:'+requestUrl);
							
						  if (!error && response.statusCode == 200) {
									
									var html=tidy.tidyString(body)
									var doc = new dom().parseFromString(html)									

									for ( var key in fields ) {
									
										var subfields = fields[key]
										
										for(var subkey in subfields){
										
											console.log(subfields[subkey])
											//Include extensions for processing 
											require('./includes/'+subfields[subkey]+'.include.js')
											global[subfields[subkey]](subkey,doc,requestUrl);

										}
										//Dummy
										var array
										callback(array);
									

									}

						  }
					  
						})
					}
		})
		c.pipe(d).pipe(c);
});
server.listen(5050)


и соответственно сторона PHP для вызова:
public function run($args){
		require_once "extensions/DNode/DNode.php";
		
		$dnode = new \DnodeSyncClient\Dnode();
		$connection = $dnode->connect('localhost', 5050);
		
		
		$fields=Fields::model()->findAll();
		
		foreach($fields as $field){
				$js_field[$field->name]=array($field->path=>$field->function);
		}
		
		$pages=Pages::model()->findAll();
		
		
		foreach($pages as $page){	
					
			$response = $connection->call('mul', array($page->url,$js_field));
			var_dump($response);
			
			
		}
		
	}



После нескольких дней поиска причины пришел к тому, что ошибка возникает только тогда когда обварачиваю все в Dnode. Т.е. если в Nodejs задать руками массивы, которые должны приходить из PHP то ошибки нет. Если же обварачиваю в удаленную процедуру то Nodа выкидывает ошибку
stream.js:81
      throw er; // Unhandled stream error in pipe.
            ^
Error: write EPIPE
    at errnoException (net.js:769:11)
    at Object.afterWrite (net.js:593:19)



Пробовал искать, но многие ссылаются на epipebomb. Установив его проблема не решается.

Теоретически представляю что всего скорей проблема возникает из за рассинхронизации потоков, а DNode всего скорей расчитана на один поток (Запрос-Ответ)


В общем вопрос прост — кто сталкивался с связкой NodeJS+Php+Dnode и как заставить их работать?
  • Вопрос задан
  • 5746 просмотров
Подписаться 5 Оценить Комментировать
Решения вопроса 1
wickedweasel
@wickedweasel
github.com/mhart/epipebomb#notes
epipebomb ловит только те ошибки, которые вызваны консольными EPIPE

В целом это скорей всего ошибка в самом dnode, оно почему-то пытается писать в сокет, в который уже нельзя писать. Там даже уже есть баг на эту тему: github.com/substack/dnode/issues/107

Недавно я эти ошибки пофиксал в axon'e.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект