types错误:对象{…}没有方法“查找” – 当使用expression的mongoose

我无法使用mongoose模式从MongoDB获取数据。 我第一次testing只用mongoose在一个单一的文件(mongoosetest.js),它工作正常。 但是当我开始用高速路线和configuration文件分割它时,情况开始中断。 我确定这很简单,但是我花了最近3个小时的search结果,试图弄清楚我做错了什么,找不到与我的过程相匹配的任何足以进行比较的东西。

mongoosetest.js(这工作正常,但不适用于我的应用程序)

var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/meanstack'); var db = mongoose.connection; var userSchema = mongoose.Schema({ name: String }, {collection: 'users'}); var User = mongoose.model('User', userSchema); User.find(function(err, users) { console.log(users); }); 

这些文件是我有问题的地方。 我确定这是愚蠢的,可能是使用外部文件,导出和需求的直接结果。 我的server.js文件只是启动和configuration快递。 我也有一个路由文件和一个数据库configuration文件。

路由文件(allRoutes.js)

 var express = require('express'); var router = express.Router(); var db = require('../config/db'); var User = db.User(); // routes router.get('/user/list', function(req, res) { User.find(function(err, users) { console.log(users); }); }); // catch-all route router.get('*', function(req, res) { res.sendfile('./public/index.html'); }); module.exports = router; 

dbconfig文件(db.js)

 var mongoose = require('mongoose'); var dbHost = 'localhost'; var dbName = 'meanstack'; var db = mongoose.createConnection(dbHost, dbName); var Schema = mongoose.Schema, ObjectId = Schema.ObjectId; db.once('open', function callback() { console.log('connected'); }); // schemas var User = new Schema({ name : String }, {collection: 'users'}); // models mongoose.model('User', User); var User = mongoose.model('User'); //exports module.exports.User = User; 

当我浏览到localhost:3000 / user / list时收到以下错误

 TypeError: Object { _id: 5398bed35473f98c494168a3 } has no method 'find' at Object.module.exports [as handle] (C:\...\routes\allRoutes.js:8:8) at next_layer (C:\...\node_modules\express\lib\router\route.js:103:13) at Route.dispatch (C:\...\node_modules\express\lib\router\route.js:107:5) at C:\...\node_modules\express\lib\router\index.js:213:24 at Function.proto.process_params (C:\...\node_modules\express\lib\router\index.js:284:12) at next (C:\...\node_modules\express\lib\router\index.js:207:19) at Function.proto.handle (C:\...\node_modules\express\lib\router\index.js:154:3) at Layer.router (C:\...\node_modules\express\lib\router\index.js:24:12) at trim_prefix (C:\...\node_modules\express\lib\router\index.js:255:15) at C:\...\node_modules\express\lib\router\index.js:216:9 

就像我说的,这可能是愚蠢的,因为我的单个文件(mongoosetest.js)按预期的方式工作,所以我试图组织我的代码。 谢谢。

你为什么打给User

 var User = db.User(); 

尝试

 var User = db.User; 

调用它是允许的,因为它是一个构造函数,但它可能不会返回任何有用的东西(错误消息意味着它正在构造一个空的User对象,我认为)。

我想到了。

显然,db.once('open'…与mongoose.connect并不相同。将我的dbconfig.js文件切换到以下版本,并且一切正常(在UserRoutes.js中使用var User = db.User作为Aaron杜福尔build议)。

 var mongoose = require('mongoose'); var Schema = mongoose.Schema, ObjectId = Schema.ObjectId; mongoose.connect('mongodb://localhost/meanstack'); // schemas var User = new Schema({ name : String }, {collection: 'users'}); // models mongoose.model('User', User); //exports module.exports.User = mongoose.model('User'); 

编辑:不能标记为2天的答案。