NodeJS实现库存出入库页面渲染报错求助
问题解决:点击入库/出库按钮渲染对应页面&修复HTTP响应报错
首先说你的报错原因:你在同一个请求里调用了两次res.render,HTTP协议要求每个请求只能返回一次完整响应,第一次res.render已经把页面发送给客户端了,第二次再调用就会触发ERR_HTTP_HEADERS_SENT错误——因为响应头已经发出去,没法再修改或发送新的响应。
要实现点击不同按钮渲染对应页面,得从前端路由跳转和后端拆分处理逻辑两方面修改:
1. 前端主页面按钮调整
给「入库」和「出库」按钮设置不同的跳转链接,把商品ID带在URL里:
<!-- 主页面按钮示例 --> <a href="/stock-in/<%= stock._id %>" class="btn btn-primary">入库</a> <a href="/stock-out/<%= stock._id %>" class="btn btn-secondary">出库</a>
点击不同按钮时,会发起不同的请求到后端对应的路由。
2. 后端拆分路由与处理函数
把原来的getFlowerViewDetails拆成两个独立函数,分别处理入库和出库页面的渲染:
修正后的后端控制器代码
// 处理入库页面请求 exports.getStockInPage = async (req, res, next) => { // 注意:如果用Mongoose的findById,它是异步操作,必须用await或.then获取实际数据 const stock = await Stocks.findById(req.params.stockID); res.render('stock-in', { st: stock }); }; // 处理出库页面请求 exports.getStockOutPage = async (req, res, next) => { const stock = await Stocks.findById(req.params.stockID); res.render('stock-out', { st: stock }); };
配置对应路由
在路由文件(比如routes/stocks.js)中添加这两个路由:
const express = require('express'); const router = express.Router(); const stockController = require('../controllers/stockController'); // 入库页面路由 router.get('/stock-in/:stockID', stockController.getStockInPage); // 出库页面路由 router.get('/stock-out/:stockID', stockController.getStockOutPage); module.exports = router;
额外注意点
- 你原来的代码里
const stocks = Stocks.findById(req.params.stockID);如果用的是Mongoose,findById返回的是Promise对象,不是直接的数组/数据,必须用await或.then()获取实际数据,否则模板里的st.flowerName会取不到值。 - 你提供的入库、出库模板片段没问题,只要后端正确传入
st数据,就能正常渲染商品信息。
调整完成后,点击「入库」按钮会跳转到/stock-in/商品ID,后端渲染入库页面;点击「出库」按钮跳转到/stock-out/商品ID,后端渲染出库页面,同时也不会再出现响应头重复发送的错误。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

