使用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
相关产品推荐
相关产品推荐

