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

使用Express+Mongoose获取MongoDB数据时遇Cannot GET /api错误求助

解决Express中Cannot GET /api错误的排查方案

核心问题定位

Cannot GET /api 说明Express服务器无法匹配到/api路径的GET请求路由,既然数据库连接正常,重点排查路由定义、路由挂载、文件路径匹配这几个环节。


1. 检查路由文件的GET根路由定义

确保你的routes/api.js(或对应路由文件)中存在/路径的GET路由定义,否则访问/api会返回404。

错误示例(缺少根路由):

const express = require('express');
const router = express.Router();
const itemController = require('../controllers/itemController');

// 仅定义了/api/items路由,无/api根路由
router.get('/items', itemController.getItems);

module.exports = router;

修正方案:

添加/路径的GET路由,直接返回数据数组:

const express = require('express');
const router = express.Router();
const itemController = require('../controllers/itemController');

// 新增/api根路由,调用控制器获取并返回数据
router.get('/', async (req, res) => {
  try {
    const items = await itemController.getAllItems();
    res.status(200).json(items);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

router.get('/items', itemController.getItems);

module.exports = router;

2. 验证Server.js中的路由挂载是否正确

确保你在server.js中正确将路由挂载到/api路径,路径不匹配会导致路由无法被识别。

正确挂载示例:

const express = require('express');
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const mongoSanitize = require('express-mongo-sanitize');
// 确保路由文件路径与实际文件一致
const apiRoutes = require('./routes/api');

dotenv.config();
const app = express();

// 必备中间件
app.use(express.json());
app.use(mongoSanitize());

// 关键:将路由挂载到/api路径
app.use('/api', apiRoutes);

// 数据库连接(已确认正常,可保留)
mongoose.connect(process.env.MONGO_URI)
  .then(() => console.log('MongoDB连接成功'))
  .catch(err => console.error('DB连接失败:', err));

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`服务器运行在端口 ${PORT}`));

常见错误:

  • 挂载路径写错(比如写成app.use('/api/v1', apiRoutes),此时需访问/api/v1而非/api)
  • 路由文件require路径错误(比如写成require('./routes/apiRoutes')但实际文件是api.js)

3. 确认控制器函数正确返回响应

即使路由匹配成功,如果控制器没有调用res.json()/res.send()返回响应,也会导致请求异常,此步骤为辅助验证:

// controllers/itemController.js示例
const Item = require('../models/Item');

exports.getAllItems = async () => {
  try {
    const items = await Item.find({});
    return items;
  } catch (err) {
    throw new Error('获取数据失败');
  }
};

// 也可直接在控制器中处理响应
exports.getItems = async (req, res) => {
  try {
    const items = await Item.find({});
    res.status(200).json(items);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
};

4. 验证项目目录结构匹配

确保你的文件目录结构与require路径一致,避免因路径错误导致路由未加载:

项目根目录/
├── models/
│   └── Item.js       # Mongoose模型文件
├── controllers/
│   └── itemController.js  # 业务逻辑控制器
├── routes/
│   └── api.js        # API路由定义
├── server.js         # 服务器入口文件
└── .env              # 环境变量配置

测试步骤

  1. 重启Express服务器(避免缓存旧代码)
  2. 访问http://localhost:3000/api(替换为你的实际端口)
  3. 查看控制台是否有报错信息,若有根据错误提示调整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:12:37