fs.readFile(path, callback) 是異步非阻塞,回調函數在未來某個時刻執行,外部代碼**同步繼續執行**,無法直接獲取回調內的數據。
const fs = require('fs');
try {
const data = fs.readFileSync('file.txt', 'utf8'); // 阻塞直到讀取完成
console.log(data); // 直接使用
processData(data);
} catch (err) {
console.error('讀取失敗:', err);
}
適用:啟動階段配置加載、小文件、無高併發要求。
const fs = require('fs').promises; // Node 10+ 原生支持
async function readConfig() {
try {
const data = await fs.readFile('file.txt', 'utf8');
return processData(data); // 異步等待,代碼風格同步
} catch (err) {
throw new Error(`讀取失敗: ${err.message}`);
}
}
// 使用
readConfig().then(result => console.log(result));
// 原始回調風格
fs.readFile('a.txt', 'utf8', (err, a) => {
fs.readFile('b.txt', 'utf8', (err, b) => {
fs.readFile('c.txt', 'utf8', (err, c) => {
console.log(a + b + c);
});
});
});
// Promise.all 並行讀取
const [a, b, c] = await Promise.all([
fs.readFile('a.txt', 'utf8'),
fs.readFile('b.txt', 'utf8'),
fs.readFile('c.txt', 'utf8')
]);
console.log(a + b + c);
Node.js 文件系統官方指南:fs.readFile 同步/異步完整教程
**總結**:需在回調外使用數據 → 用 readFileSync(阻塞)或 await fs.promises.readFile()(非阻塞等待),二者本質都是「等待異步完成再繼續」。