web-dev-qa-db-ja.com

fs.readFileSync()からfs.readFile()へのNode.js

Node.jsで、特にhtmlファイルを読み取るために、同期と非同期の両方を回避しようとしています。

要求ハンドラーで、使用している同期バージョンは次のとおりです。

var fs = require("fs");
var filename = "./index.html";
var buf = fs.readFileSync(filename, "utf8");

function start(resp) {
    resp.writeHead(200, {"Content-type":"text/html"});
    resp.write(buf);
    resp.end();
    }

exports.start=start; 
  1. ReadFile()を使用しているバージョンは何ですか?
  2. ReadFileは非同期であることを理解しているので、理論的にはファイル全体が読み込まれるのを待ってからレンダリングする必要があるので、addListenerを導入する必要がありますか?私はさまざまなことを混乱させているかもしれません。

編集:私はこのようなコードをリファクタリングしようとしました:

var fs = require("fs");
var filename = "./index.html";
function start (resp) {
    resp.writeHead(200, {"Content-Type":"text/html"});
    fs.readFile(filename, "utf8", function (err, data) {
        if (err) throw err;
        resp.write(data);
        });
    resp.end();
    }

空白のページが表示されます。resp.write(data)の前にすべてのデータが読み取られるのを待つ必要があるためだと思います。

42
Bondifrench
var fs = require("fs");
var filename = "./index.html";

function start(resp) {
    resp.writeHead(200, {
        "Content-Type": "text/html"
    });
    fs.readFile(filename, "utf8", function(err, data) {
        if (err) throw err;
        resp.write(data);
        resp.end();
    });
}
42
webduvet

ファイルが存在するかどうかがわからないため、このバリアントの方が優れています。ファイルの内容を読み取れることが確実にわかっている場合は、正しいヘッダーを送信する必要があります。また、「。end()」で終了しないコードのブランチがある場合、ブラウザはそれらを取得するまで待機します。つまり、ブラウザは長時間待機します。

var fs = require("fs");
var filename = "./index.html";

function start(resp) {

    fs.readFile(filename, "utf8", function(err, data) {
        if (err) {
            // may be filename does not exists?
            resp.writeHead(404, {
                'Content-Type' : 'text/html'
            });
            // log this error into browser
            resp.write(err.toString());
            resp.end();
        } else {

            resp.writeHead(200, {
                "Content-Type": "text/html"
            });      
            resp.write(data.toString());
            resp.end();
        }
    });
}