MERN应用中database.collection抛出'not a function'错误求助
解决TypeError: database.collection is not a function问题
嘿,这个问题我之前也碰到过,根源就是你用的MongoDB Node.js驱动版本(v3.0.1)和2014年教程里的旧版本API不兼容,直接照搬旧代码肯定会踩坑!
问题出在哪?
在MongoDB驱动3.x版本里,MongoClient.connect()的回调函数返回的第一个有效参数是MongoClient实例,而不是教程里的直接数据库对象。你现在调用database.collection()会报错,就是因为这个client对象压根没有collection方法——和旧版本的行为完全不一样!
怎么修复?
只需要修改server.js里的连接代码,从client实例中获取你要操作的数据库就行,代码改完是这样:
const express = require('express'); const MongoClient = require('mongodb').MongoClient; let app = express(); app.use(express.static('public')); app.listen(3000); MongoClient.connect(process.env.MONGO_URL, (err, client) => { if (err) throw err; // 从client里拿到你的目标数据库(就是mlab上的rgr-stack) const db = client.db('rgr-stack'); db.collection("links").find({}).toArray((err, links) => { if (err) throw err; console.log(links); // 要是操作完不需要保持连接,可以加上这句关闭连接 client.close(); }) })
补充说明
MongoDB驱动3.x做了API重构,把数据库实例的获取放到了client的db()方法里,这样能更灵活地切换数据库,也是驱动架构升级的必然变化。你之前找的解决方案没用,大概率是那些方案针对的是其他版本或者不同场景的问题。
最后再检查下:
- 确认
MONGO_URL环境变量已经正确导出,没有拼写错误 - 确保mlab上的数据库用户有足够权限访问
rgr-stack
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

