使用spawn函数处理静态htm

时间:2014-03-13 12:20:19

标签: javascript node.js stream pipe spawn

我尝试编写Web服务器以进行debuging目的。 在发送响应之前,它使用gpp(通用预处理器)处理静态html文件。

    var app = http.createServer(function(req, res){

    if( req.url.match( /\.html$/ )){

        send( req, '.' + req.url ).pipe( res, [ gpp.stream() ]);
    }
    else{

        send(req, '.' + req.url).pipe( res );
    }

}).listen(8000);

我使用"发送" npm包由我打补丁。最初"发送"使用HTTP标头发送支持它们的静态文件。 我向原始模块添加了一组流,以转换请求的静态文件。

   // pipe
  var stream = fs.createReadStream(path, options);
  this.emit('stream', stream);

  var sm = stream;

  if (transforms instanceof Array) {
      for (var i=0; i<transforms.length; i++) {
          sm = sm.pipe(transforms[i]);
      }
  }

  sm.pipe(res);

gpp模块:

module.exports.stream = function(){

var gpp = spawn( 'gpp', [ '-Iapp' ]);

gpp.stdin.pipe = function( dest, pipeOpts ){

    return Readable.prototype.pipe.apply( gpp.stdout, arguments );
}

return gpp.stdin;
};

问题是:html页面没有完全加载到浏览器中。

我的html页面来源(我省略了不必要的员工):

<html xmlns="http://www.w3.org/1999/xhtml" ng-app="app" ng-controller="AppCtrl">
<head>
#include "scripts-debug.tpl.html"
</head>
<body>
#include "body.tpl.html"
</body>
</html>

我在浏览器中看到的内容(查看页面来源):

<html xmlns="http://www.w3.org/1999/xhtml" ng-app="app" ng-controller="AppCtrl">
<head>
<!-- scripts-debug.tpl.html -->
<script type="text/javascript" src="app/app.js"></script>
<script type="text/javascript" src="app/con

如果我更改了gpp模块

var gpp = spawn( 'gpp', [ '-Iapp' ]);

var gpp = spawn( 'grep', [ '.' ]);

它工作正常(页面按原样加载)

如果我改变发送模块

sm.pipe(res);

sm.pipe( fs.createWriteStream( 'test.dst' ));

它工作正常(已处理的页面加载到文件中)

如果我这样做:

cat app/index-debug.html | gpp -Iapp

它工作正常(已处理的页面在stdout上)

我认为流同步中的某个地方存在问题。 但是我无法找到它。

0 个答案:

没有答案