我正在尝试使用以下代码:
'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');
答案 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.promisify
将fs.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的主干 - 通过允许将异步方法放到事件循环中,它可以防止代码被阻塞。