如何通过RESTful API获取MongoDB集合数据?新手技术求助
解决通过RESTful API获取MongoDB集合数据的问题
我帮你定位到了几个关键错误,这些就是导致接口无响应的核心原因,咱们一步步来修正:
1. 模型层getLists函数语法错误
在models/list.js里,你调用Item.find的写法完全不对——find方法的第一个参数是查询条件(空对象代表查询全部文档),第二个参数才是回调函数,你把回调写到了查询条件的位置里:
// models/list.js 修正后代码 const mongoose = require('mongoose'); const config = require('../config/database'); const ItemSchema = mongoose.Schema({ item: { type: String }, completed: { type: Boolean } }); const Item = module.exports = mongoose.model('Item', ItemSchema); module.exports.getLists = function(callback) { // 修正:空对象表示查询集合所有数据,第二个参数传入回调 Item.find({}, callback); }
2. 路由层响应逻辑的双重错误
在routes/list.js里有两个致命问题:
find方法返回的todos是文档数组,你直接写todos.item、todos.completed是取不到值的,应该直接返回整个数组res.json里的对象语法错误,list: item: todos.item这种嵌套写法不符合JSON规范
另外你还漏掉了router的导出,这会导致路由根本无法被加载!修正后的路由代码:
// routes/list.js 修正后代码 const express = require('express'); const router = express.Router(); const List = require('../models/list'); // 获取所有待办项 router.get('/lists', (req, res, next) => { List.getLists((err, todos) => { if(err) { // 把错误信息返回,方便你调试排查 return res.json({success: false, msg: '获取列表失败', error: err.message}); } // 直接返回查询到的文档数组即可 res.json({ success: true, list: todos }); }); }); // 必须导出router,否则server.js无法加载这个路由模块 module.exports = router;
3. 额外需要注意的细节
- 你的路由文件夹拼写是
routs,应该改成routes,否则server.js里的require('./routes/list')会找不到文件 - 确认
config/database.js里的MongoDB连接配置是正确的(比如数据库地址、用户名密码等) - 测试时可以用Postman或curl访问
http://localhost:3000/todos/lists,就能看到返回的集合数据了
现在重启服务器,应该就能正常获取items集合里的所有数据了(mongoose会自动把模型名Item转为复数集合名items,这部分是没问题的)。
内容的提问来源于stack exchange,提问作者Cuong Vo
相关产品推荐
相关产品推荐

