如何在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
相关产品推荐
相关产品推荐

