Как правильно реализовать API Streamjs nodejs? - PullRequest
2 голосов
/ 06 августа 2011

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

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

Большинство вещей, кажется, работают просто отлично, но что-то нарушает мою реализацию 'pipe':

MemoryStream.prototype = new process.EventEmitter;

MemoryStream.prototype.pipe = function(dest,opts){
    var that=this;
    function pipe_mem(data){
        if(!dest.write(data)){
            that.pause();
            dest.once('drain',function(){
                if(pipe_mem(data)){that.resume();}
            });
            return false;
        }
        return true;
    }
    this.on('data',pipe_mem);
    if(!opts || opts.end){this.on('end',dest.end);}
    this.resume();
};

MemoryStream.prototype.resume = function(){
    var i,l,encoder;
    if(this.active) return;
    this.active = true;
    l = this.buffer.length-1;
    if(l>=0){
        encoder = this.encoding?emit_string:emit_buffer;
        for(i=0;i<l;i++){encoder(this,this.buffer[i],this.encoding);}
        if(this.buffer[i]===''){
            this.emit('end');
            this.destroy();
        }else{encoder(this,this.buffer[i],encoding);}
        this.buffer = [];
    }
};

Всякий раз, когда я вызываю 'pipe', я получаю странную ошибку:

TypeError: Object #<EventEmitter> has no method '_implicitHeader'
    at EventEmitter.<anonymous> (http.js:651:10)
    at EventEmitter.emit (events.js:61:17)
    at EventEmitter.resume (/MemoryStream.js:36:9)

Где /MemoryStream.js строка 36: this.emit('end');

Есть идеи, что происходит? Как я могу это исправить или есть лучший способ сделать то, что я хочу?

1 Ответ

4 голосов
/ 17 декабря 2011

Ответ таков: где-то вы называете что-то вроде этого:

var end = response.end; response.end = function() { end() }

Вместо чего-то вроде этого:

var end = response.end; response.end = function() { response.end = end; response.end() }

Видите?Контекст отличается: в первом случае вы вызываете его с помощью this === global, но функции global._implicitHeader не существует, а во втором случае вызываете с помощью this === response, иФункция response._implicitHeader.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...