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