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

EJS渲染MongoDB文档报错TypeError: req.next is not a function

问题根因

TypeError: req.next is not a function 是典型的Express重复响应错误,由三个代码问题共同触发:

  • 单次HTTP请求仅允许返回一次响应,你在遍历查询结果的for循环中多次调用res.render(),只要查询到的库存记录数≥2,第一次渲染完成后响应就已经关闭,后续的res.render()调用就会触发内部异常
  • 循环结束后额外调用了res.end(),而res.render()本身已经会自动结束响应,多余的结束调用也会触发错误
  • stock.save的错误分支没有加return,保存失败执行重定向后,后续逻辑如果未被拦截会继续执行,也可能触发重复响应问题
修复方案
  1. 提前整理所有需要传给模板的数据,仅调用一次res.render()完成响应,禁止在循环内执行响应操作
  2. 所有响应分支执行后加return拦截,避免后续逻辑继续运行
  3. 删除多余的res.end()调用,res.render/res.redirect方法会自动处理响应结束逻辑

修正后的业务代码如下:

const stockSchema = mongoose.Schema({
  rollingStockNumber: String,
  docs: {
    naturka: String,
    address: String,
    coefficient: String,
    wheel: String,
    weight: Number
  }
});

const Stock = mongoose.model('Stock', stockSchema);
const stock = new Stock({
  rollingStockNumber: rollingStock,
  docs: {
    naturka: naturkaMinifiedArrayReady[i],
    address: arrayOfWayPlanForm[i],
    coefficient: valueOfCarLength[i],
    wheel: numberOfWheels[i],
    weight: valueOfCarWeight[i]
  }
});
stock.save((err) => {
  if (err) {
    return res.redirect('/'); // 执行重定向后直接终止回调
  }
});

app.post('/indexReplaced.html', (req, res) => {
  Stock.find({}, function(err, foundStocks){
    if (err) {
      console.log('查询错误', err);
      return res.status(500).send('数据查询失败'); // 错误分支直接返回
    }
    // 提前提取所有地址数据组装为数组
    const addressList = foundStocks.map(stock => stock.docs.address);
    // 单次调用render,传入完整数据集
    return res.render('indexCalculated', {items: addressList});
  })
});
模板适配说明

修复后传给EJS模板的items是地址数组,需要在模板中遍历输出,示例写法:

<ul>
  <% items.forEach(function(address){ %>
    <li><%= address %></li>
  <% }) %>
</ul>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 02:48:32