读node的API过程中发现了response的中一句
The response inherits from Stream, and additionally implements the following:
(这个类实现了(而不是继承自)可写流 接口。 它是一个有以下事件的 [
EventEmitter
]:)
-
来理解一下 fs.createReadStream( filePath).pipe(response);
- createReadStrem 是返回 : <fs.ReadStream> 详见可读流。
- response 当然就是响应
- pipe是将两个数据流连接起来。
-
这样就可以输出数据流了么?
- 我们知道WriteStream (可写流是对数据要被写入的目的地的一种抽象。)
- 所有可写流的例子(包括fs的写入流)都实现了 stream.Writable类定义的接口。
- 也就是说可以输出数据流
- 而前言提到response 也实现了可写流接口
- 那么fs.createReadStream 与response拼接响应,就可以输出了
-
来个小例子
const http = require('http'); const fs = require('fs'); const url = require('url'); const path =require('path'); // 从命令行参数获取root目录,默认是当前目录: var root = path.resolve(process.argv[2] || '.'); console.log('Static root dir: ' + root); // 创建服务器: var server = http.createServer(function (request, response) { // 获得URL的path,类似 '/css/bootstrap.css': var pathname = url.parse(request.url).pathname; // 获得对应的本地文件路径,类似 '/srv/www/css/bootstrap.css': var filepath = path.join(root, pathname); // 获取文件状态:fs.stat() 来检查某个文件是否存在,stats 为 fs.Stats 对象,它提供了一个文件的信息 fs.stat(filepath, function (err, stats) { if (!err && stats.isFile()) {//如果 fs.Stats对象表示一个普通文件,stats.isFile()则返回 true // 没有出错并且文件存在: console.log('200 ' + request.url); // 发送200响应: response.writeHead(200); // 将文件流导向response: fs.createReadStream(filepath).pipe(response); } else { // 出错了或者文件不存在: console.log('404 ' + request.url); // 发送404响应: response.writeHead(404); response.end('404 Not Found'); } }); }); server.listen(8080);