Подтвердить что ты не робот

Node.js из fs.readFileSync() в fs.readFile()

Я пытаюсь настроить синхронный асинхронный режим в 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; 
  • Какая будет версия с помощью readFile()??
  • Я понимаю, что 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), как я могу это сигнализировать?

4b9b3361

Ответ 1

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

Ответ 2

Этот вариант лучше, потому что вы не можете знать, существует ли файл или нет. Вы должны отправить правильный заголовок, если знаете, что можете прочитать содержимое своего файла. Кроме того, если у вас есть ветки кода, которые не заканчиваются на ".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();
        }
    });
}