TypeError:对象{...}没有方法'find' - 当使用mongoose和express时

时间:2014-06-11 20:54:36

标签: node.js express mongoose

我在使用带有express的mongoose架构从MongoDB获取数据时遇到问题。 我首先在一个文件(mongoosetest.js)中使用mongoose进行测试,它运行正常。但是当我开始用快速路由和配置文件将它们全部分开时,事情开始破裂。我确定这很简单,但是我花了最近3个小时的谷歌搜索并试图弄清楚我做错了什么,找不到与我匹配的东西过程足以比较。

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文件刚刚启动并配置express。我还有一个路由文件和一个db配置文件。

路由文件(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)按预期工作,我可能会因为试图组织我的代码而感到愚蠢。感谢。

2 个答案:

答案 0 :(得分:2)

你为什么打电话给User

var User = db.User();

尝试

var User = db.User;

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

答案 1 :(得分:1)

我明白了。

显然,db.once('打开' ...与mongoose.connect相同。将我的dbconfig.js文件切换为以下内容并且一切正常(使用var User = db.User;在aaron Dufour建议的allRoutes.js中。)

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天的答案。