I'm having trouble getting data from MongoDB using mongoose schemas with express.
I first tested with just mongoose in a single file (mongoosetest.js) and it works fine. But when I start dividing it all up with express routes and config files, things start to break. I'm sure it's something simple, but I've spent the last 3 hours googling and trying to figure out what I'm doing wrong and can't find anything that matches my process enough to compare.
mongoosetest.js (this works fine, but not for my application)
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);
});
These files are where I'm having issues. I'm sure it's something silly, probably a direct result of using external files, exports, and requires. My server.js file just starts up and configures express. I also have a routing file and a db config file.
routing file (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 file (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;
I receive the following error when I browse to 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
Like I said, it's probably something silly that I'm messing up with trying to organize my code since my single file (mongoosetest.js) works as expected. Thanks.