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

Node.js中如何等待HTTP请求完成后再执行后续代码

解决JavaScript异步GET请求导致变量未定义的问题

你的问题核心是JavaScript异步操作的执行顺序:https.get是异步API,它不会阻塞后续代码的执行。当你调用https.get后,JavaScript会继续执行后面的console.log(quote)和res.render,此时请求还没完成,quote自然是undefined。

解决方法一:将后续逻辑移到异步回调内

把依赖异步结果的代码(打印变量、渲染页面)放到end事件的回调函数里,这个回调只有在请求完成、所有数据接收完毕后才会触发:

app.get("/", function (req, res) {
    const url = "https://animechan.vercel.app/api/random";
    let str = "";
    
    https.get(url,(response)=>{
        response.on("data",(data)=>{
            str += data;
        });
        response.on("end",()=>{
            const info = JSON.parse(str);
            const quote = info.quote;
            console.log(quote);
            // 此时quote已被赋值,可正常渲染页面
            res.render("header", {
                quote: quote
            });
        });
    });
});

解决方法二:用Promise + async/await优化代码

如果觉得嵌套回调(回调地狱)不够直观,可以用Promise封装异步操作,再结合async/await让代码看起来像同步执行:

  1. 先封装HTTP请求为Promise:
function fetchQuote(url) {
    return new Promise((resolve, reject) => {
        let str = "";
        https.get(url, (response) => {
            response.on("data", (data) => {
                str += data;
            });
            response.on("end", () => {
                try {
                    const info = JSON.parse(str);
                    resolve(info.quote);
                } catch (parseErr) {
                    reject(parseErr);
                }
            });
        }).on("error", (reqErr) => {
            reject(reqErr);
        });
    });
}
  1. 在路由处理函数中使用async/await:
app.get("/", async function (req, res) {
    const url = "https://animechan.vercel.app/api/random";
    try {
        // 等待Promise完成,拿到quote的值
        const quote = await fetchQuote(url);
        console.log(quote);
        res.render("header", {
            quote: quote
        });
    } catch (err) {
        console.error("请求失败:", err);
        res.status(500).send("获取数据出错");
    }
});

深入学习的途径

  • 先掌握JavaScript异步编程核心:从回调函数入手,再学习Promise,最后理解async/await的语法糖逻辑,同时搞清楚事件循环的工作原理,明白异步代码为什么会“不等待”。
  • 学习Node.js官方文档中的http模块,了解HTTP请求的数据流处理、事件触发机制。
  • 多做异步操作的小练习:比如写代码读取本地文件、发起不同的API请求,通过打印日志观察代码执行顺序,加深对异步的理解。
  • 尝试使用更简洁的HTTP请求库(比如axios),对比原生http模块的差异,进一步理解异步请求的封装逻辑。

内容的提问来源于stack exchange,提问作者govind bhardwaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:55:15