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

如何在Express所有路由中全局复用购物车totalPrice变量?

解决方案

当然可行,给你两种实用的方法,不用在每个路由里重复声明变量:

方法一:用中间件挂载到res.locals或req对象

你可以在会话初始化的中间件之后,新增一个全局中间件,把购物车总价直接挂载到res.locals(模板引擎可直接访问)或者req对象上,这样所有路由都能直接调用:

const cartModel = {
  items: [],
  totals: {
    qty: 0,
    price: 0
  },
};

// 初始化购物车会话的中间件
app.use((req, res, next) => {
  if (!req.session.cart) {
    req.session.cart = { ...cartModel }; // 用展开运算符避免所有用户共享同一个对象
    // 一般无需手动调用req.session.save(),express-session会在响应结束前自动保存会话
  }
  next();
});

// 新增中间件,统一挂载购物车总价
app.use((req, res, next) => {
  // 挂载到res.locals,模板文件中可直接用totalPrice变量
  res.locals.totalPrice = req.session.cart.totals.price;
  // 也可挂载到req对象,路由里用req.totalPrice访问
  req.totalPrice = req.session.cart.totals.price;
  next();
});

// 路由里直接使用
app.get("/", (req, res) => {
  console.log(res.locals.totalPrice); // 直接调用
  console.log(req.totalPrice); // 或用这种方式
  // 其他业务逻辑
});

app.get("/checkout", (req, res) => {
  console.log(res.locals.totalPrice);
  // 其他业务逻辑
});

方法二:给购物车对象添加getter属性

修改cartModel,添加一个totalPrice的getter方法,这样每次访问req.session.cart.totalPrice就自动返回总价,无需重复写嵌套路径:

const cartModel = {
  items: [],
  totals: {
    qty: 0,
    price: 0
  },
  // 添加getter,自动返回总价
  get totalPrice() {
    return this.totals.price;
  }
};

// 初始化会话的中间件
app.use((req, res, next) => {
  if (!req.session.cart) {
    // 用Object.create继承getter,避免共享对象
    req.session.cart = Object.create(cartModel);
    // 也可以用展开运算符+手动绑定getter:
    // req.session.cart = {
    //   ...cartModel,
    //   get totalPrice() { return this.totals.price; }
    // };
  }
  next();
});

// 路由里直接调用简化后的属性
app.get("/", (req, res) => {
  const totalPrice = req.session.cart.totalPrice;
  // 其他业务逻辑
});

app.get("/checkout", (req, res) => {
  const totalPrice = req.session.cart.totalPrice;
  // 其他业务逻辑
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:35:18