我很难pipe
理解net模块的几个Node.js示例中显示的功能。
var net = require('net');
var server = net.createServer(function (socket) {
socket.write('Echo server\r\n');
socket.pipe(socket);
});
任何人都可以提供有关其工作原理以及为什么需要这样做的解释吗?
Answers:
该pipe()
功能从可读流中读取可用的数据,并将其写入目标可写流。
文档中的示例是回显服务器,它是发送接收到的信息的服务器。该socket
对象同时实现了可读和可写的流接口,因此它会将接收到的所有数据写回套接字。
这等效于使用pipe()
使用事件侦听器的方法:
var net = require('net');
net.createServer(function (socket) {
socket.write('Echo server\r\n');
socket.on('data', function(chunk) {
socket.write(chunk);
});
socket.on('end', socket.end);
});
stream.Duplex
,它同时继承stream.Readable
和stream.Writable
。在这种情况下,“接口”严格来说不是接口的OOP定义,而可以只是应用程序之间的联系点。
考虑以下请求处理程序
var server = http.createServer(function(req, res){
console.log('Request for ' + req.url + ' by method ' + req.method);
if(req.method == 'GET'){
var fileurl;
if(req.url == '/')fileurl = '/index.html';
else {
fileurl = req.url;
}
}
var filePath = path.resolve('./public'+fileurl);
var fileExt = path.extname(filePath);
if(fileExt == '.html'){
fs.exists(filePath, function(exists){
if(!exists){
res.writeHead(404, {'Content-Type': 'text/html'});
res.end('<h1>Error 404' + filePath + 'not found </h1>');
//the end() method sends content of the response to the client
//and signals to the server that the response has been sent
//completely
return;
}
res.writeHead(200, {'Content-Type':'text/html'});
fs.createReadStream(filePath).pipe(res);
})
}
}
该fs.createReadStream
方法读取给定文件路径(public/index.html
)中的文件,并将其pipe()
写入响应(res
)以供客户端查看。