从readFile返回undefined

Kar*_*son 8 javascript node.js

我正在尝试使用以下代码:

'use strict';

var fs = require('fs');

var fileName = 'readme.txt';
var str = fs.readFile(fileName, 'utf8', function (err, data) {
    if (err) {
        console.log(err);
        throw err;
    }
    return data;
});

console.log('result read: ' + str);
Run Code Online (Sandbox Code Playgroud)

readme.txt文件:

console.log('working');
Run Code Online (Sandbox Code Playgroud)

我正在尝试显示以下内容:

result read: console.log('working');
Run Code Online (Sandbox Code Playgroud)

Mar*_*nde 13

readFile是异步执行的,所以data只能在回调函数内部访问,如果你想让它同步,你应该使用readFileSync

异步:

'use strict';

const fs = require('fs');

const fileName = 'readme.txt';
fs.readFile(fileName, 'utf8', function (err, data) {
   if (err)
      return console.log(err);
   console.log('result read: ' + data);
});
Run Code Online (Sandbox Code Playgroud)

同步:

var str = fs.readFileSync(fileName, 'utf8'); // This will block the event loop, not recommended for non-cli programs.
console.log('result read: ' + str);
Run Code Online (Sandbox Code Playgroud)

UPDATE

您可以使用从回调API util.promisify转换fs.readFile为promise API.

const fs = require('fs');
const { promisify } = require('util');
const readFile = promisify(fs.readFile);

(async() =>  {
   try {
      const result = await readFile('readme.txt', 'utf8');
      consle.log(result);
   } catch(e) {
      console.error(e);
   }
})();
Run Code Online (Sandbox Code Playgroud)

在节点10中,您可以使用fs/promises并避免使用util.promisify

const fs = require('fs').promises;

(async() =>  {
   try {
      const result = await fs.readFile('readme.txt', 'utf8');
      consle.log(result);
   } catch(e) {
      console.error(e);
   }
})();
Run Code Online (Sandbox Code Playgroud)