Mongoose Get请求返回favicon.ico而非指定值,Heroku部署遇H13崩溃
问题解决思路
1. 拦截favicon.ico请求,避免被通配路由捕获
浏览器会自动向服务器发起/favicon.ico请求,而你的/:titleName通配路由会把favicon.ico当作titleName参数处理。解决方法是在通配路由之前添加专门的拦截路由:
app.get('/favicon.ico', (req, res) => res.sendStatus(204));
204状态码表示无内容,不会触发后续的通配路由逻辑。如果有自定义图标,也可以返回对应文件。
2. 修复路由中的异步操作与错误处理
你的代码存在两个可能导致Heroku H13错误的问题:
list.save()是异步操作,直接调用后立即执行redirect,可能数据库还未完成写入就跳转,引发请求异常- 未处理数据库查询出错的情况,当
err存在时没有返回任何响应,会导致请求挂起,最终触发H13连接断开错误
修改后的路由代码:
app.get("/:titleName", function (req, res) { const defaulttitleName = _.capitalize(req.params.titleName); List.findOne({ name: defaulttitleName }, function (err, foundList) { if (err) { // 处理查询错误,返回500状态码 return res.status(500).send("获取列表失败"); } if (!foundList) { const list = new List({ name: defaulttitleName, items: defaultItems, }); // 等待保存完成后再执行跳转 list.save(function(saveErr) { if (saveErr) { return res.status(500).send("保存列表失败"); } res.redirect("/" + defaulttitleName); }); } else { res.render("list", { listTitle: foundList.name, newListItems: foundList.items, }); } }); });
3. 额外检查点
- 确认Heroku环境已正确配置MongoDB连接字符串,数据库连接失败也可能引发H13错误
- 通过
heroku logs --tail查看Heroku日志,定位H13错误的具体触发场景,排查是否存在其他未处理的请求挂起情况
内容的提问来源于stack exchange,提问作者StamGio
相关产品推荐
相关产品推荐

