我在使用带有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)按预期工作,我可能会因为试图组织我的代码而感到愚蠢。感谢。
答案 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天的答案。