1. ホーム
  2. http

[解決済み] NodeJSで作る基本的な静的ファイルサーバー

2023-05-17 11:46:56

質問

私は、完璧なサーバーとしてよりも、nodeを理解するための練習として、nodejsで静的ファイルサーバーを作成しようとしています。私はConnectやnode-staticのようなプロジェクトをよく知っており、より生産的なコードのためにそれらのライブラリを使用することを完全に意図していますが、私はまた、私が働いているものの基本を理解したいのです。このことを念頭に置いて、私は小さなserver.jsをコード化しました。

var http = require('http'),
    url = require('url'),
    path = require('path'),
    fs = require('fs');
var mimeTypes = {
    "html": "text/html",
    "jpeg": "image/jpeg",
    "jpg": "image/jpeg",
    "png": "image/png",
    "js": "text/javascript",
    "css": "text/css"};

http.createServer(function(req, res) {
    var uri = url.parse(req.url).pathname;
    var filename = path.join(process.cwd(), uri);
    path.exists(filename, function(exists) {
        if(!exists) {
            console.log("not exists: " + filename);
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.write('404 Not Found\n');
            res.end();
        }
        var mimeType = mimeTypes[path.extname(filename).split(".")[1]];
        res.writeHead(200, mimeType);

        var fileStream = fs.createReadStream(filename);
        fileStream.pipe(res);

    }); //end path.exists
}).listen(1337);

私の質問は2つあります。

  1. これは、node で基本的な html などを作成しストリーミングするための正しい方法ですか、それとももっと良い、エレガントな、堅牢な方法がありますか?

  2. nodeの.pipe()は、基本的に以下のことを行っているだけでしょうか?

.

var fileStream = fs.createReadStream(filename);
fileStream.on('data', function (data) {
    res.write(data);
});
fileStream.on('end', function() {
    res.end();
});

皆さん、ありがとうございます。

どのように解決するのですか?

  • あなたの基本的なサーバーはよく見えますが、例外があります。

    には return ステートメントがありません。

    res.write('404 Not Found\n');
    res.end();
    return; // <- Don't forget to return here !!
    
    

    そして

    res.writeHead(200, mimeType);

    であるべきです。

    res.writeHead(200, {'Content-Type':mimeType});

  • はい pipe() は基本的にその通りですが、ソースストリームを一時停止/再開します (受信機の速度が遅い場合)。 以下は pipe() 関数のソースコードです。 https://github.com/joyent/node/blob/master/lib/stream.js