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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:35:17