Получение данных из fs.readFile

var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);

Журнал undefined, почему?

Комментарии к вопросу (2)
Решение

В дополнение к тому, что сказал @Raynos, функция, которую вы определили, является асинхронным обратным вызовом. Она не выполняется сразу, скорее, она выполняется, когда загрузка файла завершена. Когда вы вызываете readFile, управление возвращается немедленно и выполняется следующая строка кода. Поэтому, когда вы вызываете console.log, ваш обратный вызов еще не был вызван, и это содержимое еще не было установлено. Добро пожаловать в асинхронное программирование.

Пример подходов

const fs = require('fs');
var content;
// First I want to read the file
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;

    // Invoke the next step here however you like
    console.log(content);   // Put all of the code here (not the best solution)
    processFile();          // Or put the next step in a function and invoke it
});

function processFile() {
    console.log(content);
}

Или еще лучше, как показывает пример Raynos, обернуть вызов в функцию и передать собственные обратные вызовы. (Очевидно, это лучшая практика) Я думаю, что если вы выработаете привычку оборачивать свои вызовы async в функцию, которая принимает обратный вызов, это избавит вас от множества проблем и беспорядочного кода.

function doSomething (callback) {
    // any async callback invokes callback with response
}

doSomething (function doSomethingAfter(err, result) {
    // process the async result
});
Комментарии (4)

На самом деле для этого существует функция Synchronous:

http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_encoding

Асинхронная

fs.readFile(filename, [encoding], [callback])

Асинхронно считывает все содержимое файла. Пример:_

fs.readFile('/etc/passwd', function (err, data) {
  if (err) throw err;
  console.log(data);
});

Обратному вызову передается два аргумента (err, data), где data - содержимое файла.

Если кодировка не указана, то возвращается необработанный буфер._


SYNCHRONOUS

fs.readFileSync(filename, [encoding])

Синхронная версия fs.readFile. Возвращает содержимое файла с именем filename._

Если указана кодировка, то эта функция возвращает строку. В противном случае возвращается буфер._

var text = fs.readFileSync('test.md','utf8')
console.log (text)
Комментарии (3)
function readContent(callback) {
    fs.readFile("./Index.html", function (err, content) {
        if (err) return callback(err)
        callback(null, content)
    })
}

readContent(function (err, content) {
    console.log(content)
})
Комментарии (5)

Используя обещания с ES7

Асинхронные использовать с MZ/Ф

В [МЗ] модули(https://www.npmjs.com/package/mz) обеспечивает promisified версии библиотеки ключевых узлов. Использовать их очень просто. Сначала установить библиотеки...

npm install mz

Потом...

const fs = require('mz/fs');
fs.readFile('./Index.html').then(contents => console.log(contents))
  .catch(err => console.error(err));

Кроме того, вы можете написать их в асинхронные функции:

async function myReadfile () {
  try {
    const file = await fs.readFile('./Index.html');
  }
  catch (err) { console.error( err ) }
};
Комментарии (3)
var data = fs.readFileSync('tmp/reltioconfig.json','utf8');

используйте это для вызова файл синхронно, без кодирования его вывода данных в качестве буфера.

Комментарии (2)

Эта линия будет работать,

const content = fs.readFileSync('./Index.html', 'utf8');
console.log(content);
Комментарии (2)
const fs = require('fs')
function readDemo1(file1) {
    return new Promise(function (resolve, reject) {
        fs.readFile(file1, 'utf8', function (err, dataDemo1) {
            if (err)
                reject(err);
            else
                resolve(dataDemo1);
        });
    });
}
async function copyFile() {

    try {
        let dataDemo1 = await readDemo1('url')
        dataDemo1 += '\n' +  await readDemo1('url')

        await writeDemo2(dataDemo1)
        console.log(dataDemo1)
    } catch (error) {
        console.error(error);
    }
}
copyFile();

function writeDemo2(dataDemo1) {
    return new Promise(function(resolve, reject) {
      fs.writeFile('text.txt', dataDemo1, 'utf8', function(err) {
        if (err)
          reject(err);
        else
          resolve("Promise Success!");
      });
    });
  }
Комментарии (2)

Как сказал ФС.функцию ReadFile-это асинхронное действие. Это означает, что когда вы говорите узла, чтобы прочитать файл, нужно учитывать, что это займет некоторое время, и в то же время, узел продолжал работать следующий код. В вашем случае это'ы: приставка.журнала(контент);.

Это's, как отправлять некоторую часть кода для долгой поездки (как читать большой файл).

Взгляните на комменты, что я'вэ написано:

var content;

// node, go fetch this file. when you come back, please run this "read" callback function
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});

// in the meantime, please continue and run this console.log
console.log(content);

Что's почему "содержание" остается пустым, когда логинишься. узел еще не восстановил файл'с содержании.

Это может быть решена путем перемещения консоли.журнал(содержание) внутри функции обратного вызова, сразу после контент = данные;. Таким образом, вы увидите журнал, когда узел производится чтение файла и после "содержание" получает значение.

Комментарии (0)

синхронизации и асинхронного чтения файла образом:

//fs module to read file in sync and async way

var fs = require('fs'),
    filePath = './sample_files/sample_css.css';

// this for async way
/*fs.readFile(filePath, 'utf8', function (err, data) {
    if (err) throw err;
    console.log(data);
});*/

//this is sync way
var css = fs.readFileSync(filePath, 'utf8');
console.log(css);

Узел чит доступен на read_file.

Комментарии (0)

Использовать встроенные в библиотеке promisify (узел 8+) для того чтобы сделать эти старые функции обратного вызова более элегантным.

const fs = require('fs');
const util = require('util');

const readFile = util.promisify(fs.readFile);

async function doStuff() {
  try {
    const content = await readFile(filePath, 'utf8');
    console.log(content);
  } catch (e) {
    console.error(e);
  }
}
Комментарии (3)
var fs = require('fs');
var path = (process.cwd()+"\\text.txt");

fs.readFile(path , function(err,data)
{
    if(err)
        console.log(err)
    else
        console.log(data.toString());
});
Комментарии (0)
var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);

Это просто потому, что узел является асинхронным, и он не будет ждать функция чтения, и как только программа начинает это утешит значение undefined, что это на самом деле так, потому что нет значение, присвоенное содержание переменной. Для обработки можно использовать обещания, генераторов и т. д. Мы можем использовать обещание в эту сторону.

new Promise((resolve,reject)=>{
    fs.readFile('./index.html','utf-8',(err, data)=>{
        if (err) {
            reject(err); // in the case of error, control flow goes to the catch block with the error occured.
        }
        else{
            resolve(data);  // in the case of success, control flow goes to the then block with the content of the file.
        }
    });
})
.then((data)=>{
    console.log(data); // use your content of the file here (in this then).    
})
.catch((err)=>{
    throw err; //  handle error here.
})
Комментарии (0)

Грубо говоря, вы'ре дело с node.js который является асинхронным по своей природе.

Когда мы говорим о async, мы're говоря о выполнении или обработке информации или данных при работе с чем-то еще. Это не синоним параллельно, напоминаем.

Код:

var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
});
console.log(content);

С вашего образца, в основном он делает консоли.журнал часть первая, таким образом, переменная 'и#39; понятие не определено.

Если вы действительно хотите на выходе, сделать что-то вроде этого вместо:

var content;
fs.readFile('./Index.html', function read(err, data) {
    if (err) {
        throw err;
    }
    content = data;
    console.log(content);
});

Это является асинхронным. Это будет тяжело привыкнуть, но это. Опять же, это грубое, но быстрое объяснение того, что асинхронность.

Комментарии (0)

вы можете прочитать файл

var readMyFile = function(path, cb) {
      fs.readFile(path, 'utf8', function(err, content) {
        if (err) return cb(err, null);
        cb(null, content);
      });
    };

Добавив на вы можете записать в файл,

var createMyFile = (path, data, cb) => {
  fs.writeFile(path, data, function(err) {
    if (err) return console.error(err);
    cb();
  });
};

и даже цепь вместе

var readFileAndConvertToSentence = function(path, callback) {
  readMyFile(path, function(err, content) {
    if (err) {
      callback(err, null);
    } else {
      var sentence = content.split('\n').join(' ');
      callback(null, sentence);
    }
  });
};
Комментарии (0)

Следующая функция будет работать для асинхронный обруч или обещание", затем " цепи

константный readFileAsync = асинхронный (путь) => ПС.readFileSync(путь, 'в формате utf8');

Комментарии (0)