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

Express异步执行时响应体变为Cannot GET路由且返回404的问题

问题原因与解决方案

核心原因

你遇到的问题本质是请求未被路由正确处理,导致Express默认的404兜底逻辑在异步等待期间触发,具体可能由以下两种情况导致:

1. 路由挂载路径不匹配

你的路由定义是router.get("/", ...),但请求的是/articles路径。如果这个路由没有被正确挂载到/articles路径下(比如挂载路径拼写错误、挂载顺序错误),Express会认为该请求没有匹配到任何路由,从而触发默认404响应。

2. 异步操作错误未被捕获

ArticleModel.find()执行时可能抛出错误(比如数据库连接失败、权限问题),但你的async路由函数没有用try/catch捕获错误,也没有将错误传递给next(),导致Express无法识别该请求正在被处理,最终触发404兜底逻辑(而非预期的500错误)。


解决方案

步骤1:确认路由挂载正确性

确保你的路由被正确挂载到/articles路径,且挂载顺序在404中间件之前:

const express = require('express');
const app = express();
const articleRouter = require('./path/to/your/article-router');

// 先挂载业务路由
app.use('/articles', articleRouter);

// 最后挂载404兜底中间件
app.use((req, res) => {
  res.status(404).send(`<pre>Cannot GET ${req.path}</pre>`);
});

步骤2:捕获异步操作错误

在async路由处理函数中添加try/catch,捕获数据库查询可能出现的错误,并正确传递给Express的错误处理机制:

router.get("/", async (req, res, next) => {
    try {
        console.log(res.body); // undefined
        console.log(res.statusCode); // 200
        const articles = await ArticleModel.find();
        console.log(res.body); // 此时应无内容
        console.log(res.statusCode); // 200

        res.status(200).json(articles);
    } catch (error) {
        // 将错误传递给Express错误处理中间件
        next(error);
    }
});

步骤3:验证数据库连接状态

确保Mongoose已成功连接到MongoDB,避免因连接失败导致查询错误:

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/your-database-name')
  .then(() => console.log('MongoDB连接成功'))
  .catch(err => console.error('MongoDB连接失败:', err));

步骤4:排查中间件影响

暂时移除logResponseBody中间件,测试是否仍出现404问题,排除中间件改写res.write/res.end导致的异常:如果移除后问题消失,可检查中间件代码是否存在逻辑漏洞(比如Buffer处理错误)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:33:19