node中请求静态文件(图片例子)

309 阅读1分钟

读node的API过程中发现了response的中一句

The response inherits from Stream, and additionally implements the following:

(这个类实现了(而不是继承自)可写流 接口。 它是一个有以下事件的 [EventEmitter]:)

  1. 来理解一下 fs.createReadStream( filePath).pipe(response);

    • createReadStrem 是返回 : <fs.ReadStream> 详见可读流
    • response 当然就是响应
    • pipe是将两个数据流连接起来。
  2. 这样就可以输出数据流了么?

    • 我们知道WriteStream (可写流是对数据要被写入的目的地的一种抽象。)
    • 所有可写流的例子(包括fs的写入流)都实现了 stream.Writable类定义的接口。
    • 也就是说可以输出数据流
    • 而前言提到response 也实现了可写流接口
    • 那么fs.createReadStream 与response拼接响应,就可以输出了
  3. 来个小例子

    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);