You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:09:14