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

Express+Pug迭代数组传值失败:路由渲染无法获取对应元素

问题:Express循环创建路由时无法正确传递数组元素到Pug视图

我正在为大学课程开发一个小型Web项目,使用Express框架并以Pug作为视图引擎。我希望遍历气象站数组,为每个气象站创建路由,并在详情页展示对应数组元素的值。

后端代码

var i = 0;
while(stations[i]!= null){
    app.get('/'+stations[i]["name"], (req, res) => {
        res.render("DetailsTemplate", {Station: stations[i]})
    });
    console.log(`detailsPageRunning on ` + '/' + stations[i]["name"] + ' '+ i);
    i++;
}

Pug模板代码

block content
    div(class="details")

        div(class="station")
            div(class="station-element")
                h2 #{Station.name}
                p
            div(class="station-element")
                h2 Wetter
                p #{Station.readings.at(0).wetter}
            div(class="station-element")
                h2 Temperatur
                p #{Station.readings.at(0).temp} Grad
            div(class="station-element")
                h2 Wind
                p #{Station.readings.at(0).wind} bft.
            div(class="station-element")
                h2 Luftdruck
                p #{Station.readings.at(0).luftdruck} bpa

当前路由已按预期创建,当固定传递Station: stations[0]时页面可正常渲染,但使用Station: stations[i]迭代传值时无法显示对应内容。尝试过其他数组,仍存在相同问题。


问题原因

这是闭包陷阱导致的。while循环中创建的所有路由回调函数,都共享同一个全局变量i。当用户访问路由时,循环早已执行完毕,此时i的值已经等于数组的长度(stations[i]变为undefined),所以传递给Pug视图的Station是undefined,页面自然无法渲染出内容。

解决方法

方法1:使用块级作用域变量保存当前迭代的元素

在循环内部用const声明当前的气象站元素,形成独立的块级作用域,让每个回调函数捕获自己作用域内的元素:

let i = 0;
while(stations[i] != null){
    const currentStation = stations[i];
    app.get('/' + currentStation.name, (req, res) => {
        res.render("DetailsTemplate", { Station: currentStation })
    });
    console.log(`detailsPageRunning on /${currentStation.name} ${i}`);
    i++;
}

方法2:使用forEach遍历数组(更简洁推荐)

forEach的每次迭代都会创建独立的作用域,每个回调函数捕获的都是当前迭代的station变量,从根源避免闭包共享变量的问题:

stations.forEach((station, index) => {
    app.get('/' + station.name, (req, res) => {
        res.render("DetailsTemplate", { Station: station })
    });
    console.log(`detailsPageRunning on /${station.name} ${index}`);
});

内容的提问来源于stack exchange,提问作者Melontree productions

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:28:23