我尝试编写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上)
我认为流同步中的某个地方存在问题。 但是我无法找到它。