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

Разница между readFile и readFileSync

Следующий код выводит содержимое index.html(он просто содержит мир приветствия) в браузер. Однако, когда я заменяю readFile на readFileSync, запрос истекает. Что мне не хватает? Требуется ли другой вид буфера? Я использую node 0.61 и выражаю 2.4

var express = require('express');
var fs = require('fs');

var app = express.createServer(express.logger());

app.get('/', function(request, response) {
    fs.readFile('index.html', function(err, data){
        response.send(data.toString());
    });
});

var port = process.env.PORT || 5000;
app.listen(port, function() {
  console.log("Listening on " + port);
});
4b9b3361

Ответ 1

fs.readFile выполняет обратный вызов, который вызывает response.send, как вы показали - хорошо. Если вы просто замените это на fs.readFileSync, вам нужно знать, что он не требует обратного вызова, поэтому ваш обратный вызов, который вызывает response.send, никогда не будет получить вызов и, следовательно, ответ никогда не закончится, и он будет тайм-аут.

Вам нужно показать код readFileSync, если вы не просто замените readFile на readFileSync.

Кроме того, как вы знаете, вы должны никогда вызывать readFileSync в node express/webserver, так как он будет связывать цикл одного потока во время выполнения ввода-вывода. Вы хотите, чтобы цикл node обрабатывал другие запросы до завершения ввода-вывода, и ваш код обработки обратного вызова мог работать.

Ответ 2

'use strict'
var fs = require("fs");

/***
 * implementation of readFileSync
 */
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("Program Ended");

/***
 * implementation of readFile 
 */
fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
   console.log(data.toString());
});

console.log("Program Ended");

Для лучшего понимания выполните приведенный выше код и сравните результаты.

Ответ 3

readFileSync() является синхронным и блокирует выполнение до завершения. Они возвращают свои результаты как возвращаемые значения. readFile() являются асинхронными и возвращаются немедленно, пока они работают в фоновом режиме. Вы передаете функцию обратного вызова, которая вызывается, когда они заканчивают работу. давайте возьмем пример для неблокирования.

следующий метод читать файл как неблокирующий способ

var fs = require('fs');
fs.readFile(filename, "utf8", function(err, data) {
        if (err) throw err;
        console.log(data);
});

Далее читается файл как блокирующий или синхронный способ.

var data = fs.readFileSync(filename);

LOL... Если вы не хотите, чтобы readFileSync() как способ блокировки, воспользуйтесь ссылкой из следующего кода. (Родные)

var fs = require('fs');
function readFileAsSync(){
    new Promise((resolve, reject)=>{
        fs.readFile(filename, "utf8", function(err, data) {
                if (err) throw err;
                resolve(data);
        });
    });
}

async function callRead(){
    let data = await readFileAsSync();
    console.log(data);
}

callRead();

за кулисами это означает, что readFileSync() работает так же, как и выше (обещание).