从readFile返回undefined

时间:2016-01-24 19:17:49

标签: 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);

README.TXT:

console.log('working');

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

result read: console.log('working');

3 个答案:

答案 0 :(得分:11)

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

同步

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

<强>更新

您可以使用util.promisifyfs.readFile从回调API转换为承诺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);
   }
})();

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

答案 1 :(得分:2)

您正在调用异步函数。这意味着它不会等待在被调用时返回,在这种情况下,将返回undefined。

您可以使用readFileSync方法同步调用它,也可以将console.log放入回调

答案 2 :(得分:0)

readFile是一个异步方法(因此是回调。)您需要在异步函数的回调中使用console.log(或您想要对结果执行的任何操作)。这几乎是node.js的主干 - 通过允许将异步方法放到事件循环中,它可以防止代码被阻塞。