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

使用Node.js、Express、Mongoose创建多API时第三个接口失效

问题分析与解决

问题原因

第三个接口/products/categories无法正常工作的核心原因是Express路由匹配顺序冲突:

  • Express按路由定义的先后顺序匹配请求
  • 你先定义了/products/:_id动态参数路由,它会匹配所有/products/xxx格式的请求,包括/products/categories——此时categories会被当作_id参数传入,导致第三个接口的代码永远不会被执行

解决方案

将更具体的静态路由/products/categories放在动态参数路由/products/:_id之前,确保Express优先匹配精确的静态路由。

修改后的index.js代码

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');

const PostModel = require('./models/CreatePost')

const app = express()
app.use(cors());
app.use(express.json());

const port = 5000; 

mongoose.connect("mongodb+srv://username:<password>@cluster0.jvxew8i.mongodb.net/store")

// 先定义精确的静态路由
app.get('/products/categories', function(req, res) {
  PostModel.find({}, {category: 1, _id: 0})
  .then(products => res.json(products))
  .catch(err => res.json(err))
})

// 再定义动态参数路由
app.get('/products/:_id', function(req, res) {
  PostModel.findById(req.params._id)
  .then(products => res.json(products))
  .catch(err => res.json(err))
})

app.get('/products', function(req, res) {
  PostModel.find()
  .then(products => res.json(products))
  .catch(err => res.json(err))
})

app.listen(port, () => {
    console.log(`Server is running on port: ${port}`);
})

额外优化建议

如果需要返回去重后的分类列表,可使用distinct方法简化查询逻辑,返回更简洁的分类数组:

app.get('/products/categories', function(req, res) {
  PostModel.distinct('category')
  .then(categories => res.json(categories))
  .catch(err => res.json(err))
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 06:36:10