类型错误:对象 {...} 没有方法 'find' - 当将猫鼬与 express 一起使用时



我有麻烦从MongoDB使用猫鼬模式与express获取数据。我首先在一个文件(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);
});

这些文件是我有问题的地方。我确信这是一些愚蠢的东西,可能是使用外部文件、导出和require的直接结果。我的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:...routesallRoutes.js:8:8) at next_layer 
(C:...node_modulesexpresslibrouterroute.js:103:13) at Route.dispatch 
(C:...node_modulesexpresslibrouterroute.js:107:5) at 
C:...node_modulesexpresslibrouterindex.js:213:24 at Function.proto.process_params 
(C:...node_modulesexpresslibrouterindex.js:284:12) at next 
(C:...node_modulesexpresslibrouterindex.js:207:19) at Function.proto.handle 
(C:...node_modulesexpresslibrouterindex.js:154:3) at Layer.router 
(C:...node_modulesexpresslibrouterindex.js:24:12) at trim_prefix 
(C:...node_modulesexpresslibrouterindex.js:255:15) at 
C:...node_modulesexpresslibrouterindex.js:216:9

就像我说的,这可能是一些愚蠢的事情,我搞砸了试图组织我的代码,因为我的单一文件(mongoosetest.js)工作如预期。谢谢。

为什么要给User打电话?

var User = db.User();

var User = db.User;

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

我明白了。

显然,db.once("开放"……和猫鼬不一样,连接。将我的dbconfig.js文件切换为以下内容,一切正常(使用var User = db.User;

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天内不能把这个标记为答案

最新更新