2015-04-27 4 views
0

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

module.exports=function(callback) { 
    callbacks.push(callback); 
    return function(req,res,next) { 
     if (!res.hijacked) { 
      res.hijacked=true; 
     } else { 
      return next(); 
     } 
     var send=res.send; 
     res.send=function(data) { 
      var body=data instanceof Buffer ? data.toString() : data; 
      var requests=[]; 
      requests.push(function(next) { 
       callbacks[0](req,res)(body,doneWrapper(body,next)); 
      }); 
      for (var i=1;i<callbacks.length;i++) { 
       var hijackCallback=callbacks[i]; 
       requests.push(function(result,next) { 
        hijackCallback(req,res)(result,doneWrapper(result,next)); 
       }); 
      } 
      var that=this; 
      async.waterfall(requests,function(err,result) { 
       send.call(that,result); 
       requests=null; 
       body=null; 
       that=null; 
      }); 
     }; 
     next(); 
    }; 
}; 

Пример использования выглядит следующим образом:

module.exports=function() { 
    return hijack(function() { 
     return function(result,done) { 
      var json={}; 
      try { 
       json=JSON.parse(result); 
      } catch(e) { 
       return done(); 
      } 
      if (!_.isArray(json)) { 
       return done(); 
      } 
      var sorted=_(json).sortBy(function(item) { 
       if (_.isObject(item.information)) { 
        return item.information.rangeIndex1 || 999; 
       } else { 
        return 1001; 
       } 
      }); 
      done(sorted); 
     } 
    }); 
}; 

она работала хорошо, как первоначально в маршрутах промежуточное программное.

Однако, когда я пытаюсь сделать это как app.use(hijackMiddleware()). Что-то пошло не так, я получил эту ошибку Can't set headers after they are sent.

Нет проблем при использовании в качестве промежуточных путей на маршрутах.

ответ

0

Считаете ли вы использование express-interceptor? Действительно легко: use:

var express  = require('express'); 
var cheerio  = require('cheerio'); 
var interceptor = require('express-interceptor'); 

var app = express(); 

var finalParagraphInterceptor = interceptor(function(req, res){ 
    return { 
    // Only HTML responses will be intercepted 
    isInterceptable: function(){ 
     return /text\/html/.test(res.get('Content-Type')); 
    }, 
    // Appends a paragraph at the end of the response body 
    intercept: function(body, send) { 
     var $document = cheerio.load(body); 
     $document('body').append('<p>From interceptor!</p>'); 

     send($document.html()); 
    } 
    }; 
}) 

// Add the interceptor middleware 
app.use(finalParagraphInterceptor); 

app.use(express.static(__dirname + '/public/')); 

app.listen(3000); 
+0

thx. Я закончил с упаковкой 'req.send', поэтому он не отправляет заголовки дважды. Но теперь я перешел на koa –

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