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,保存失败执行重定向后,后续逻辑如果未被拦截会继续执行,也可能触发重复响应问题
修复方案
- 提前整理所有需要传给模板的数据,仅调用一次
res.render()完成响应,禁止在循环内执行响应操作 - 所有响应分支执行后加
return拦截,避免后续逻辑继续运行 - 删除多余的
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
相关产品推荐
相关产品推荐

