Node.js中如何让console.log先输出'Read It'再输出'Ex It'?
问题解决:让Express路由中"Read It"先输出
你的代码里await没起到作用,因为回调版本的fs.readFile不返回Promise,await只能等待Promise对象,所以代码会直接执行后面的console.log("Ex It"),等文件读取完成后才会触发回调里的"Read It"。
下面是两种可行的调整方案:
方案一:使用Promise化的fs API
Node.js内置了Promise版本的fs模块,直接用它就能让await正确等待读取完成:
const fs = require('fs').promises; app.get('/', async (req, res) => { try { const data = await fs.readFile('./views/website/index.html', 'utf8'); console.log("Read It"); console.log("Ex It"); res.render('website/index', { 'data': data }); } catch (err) { console.error('文件读取失败:', err); res.status(500).send('服务器内部错误'); } });
fs.promises.readFile会返回一个Promise,await会等待文件读取完成后才执行后续代码,这样"Read It"就会先于"Ex It"输出。同时用try/catch捕获读取过程中可能出现的错误,避免程序崩溃。
方案二:手动将回调包装为Promise
如果需要兼容旧版本Node.js,也可以手动把回调式的fs.readFile包装成Promise:
const fs = require('fs'); function readFile(path, encoding) { return new Promise((resolve, reject) => { fs.readFile(path, encoding, (err, content) => { if (err) return reject(err); resolve(content); }); }); } app.get('/', async (req, res) => { try { const data = await readFile('./views/website/index.html', 'utf8'); console.log("Read It"); console.log("Ex It"); res.render('website/index', { 'data': data }); } catch (err) { console.error('文件读取失败:', err); res.status(500).send('服务器内部错误'); } });
通过自定义Promise,在fs.readFile的回调中根据结果resolve或reject,让await能够正确等待异步操作完成。
内容的提问来源于stack exchange,提问作者Caleb Gross
相关产品推荐
相关产品推荐

