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), как я могу это сигнализировать?
Ответы
Ответ 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();
}
});
}