2017-02-20 118 views
0

我正在通过尝试构建CRUD API来学习Node,Mongoose和Express。当试图 “加入” 两个MongoDB的集合与.populate功能,我得到一个错误,如何在Express路径中使用.findOne。

db.collection(...)。findOne(...)。填充不是一个函数

我的JavaScript脚本不是很好,所以我尝试以不同的方式重写这个方法无济于事。

server.js

require('./models/User') 
require('./models/Product') 

var db 

mongodb.MongoClient.connect('mongodb://<username>:</password>@xxxx.mlab.com:xxx/xxx', (err, database) => { 
if (err) return console.log(err) 
    db = database 
    app.listen(3000, function() { 
     console.log("listening on port 3000"); 
    }) 
}) 

app.get('/api/users/:id', (req, res) => { 
db.collection(USERS_COLLECTION).findOne({ id: (req.params.id) }).populate('product'), (err, doc) => { 
    if (err) handleError(res, err.message, 'Failed to get user') 

    res.status(200).json(doc) 
    console.log(req.params) 
} 
}) 

型号/ user.js的

var mongoose = require('mongoose') 

var UserSchema = new mongoose.Schema({ 
id: String, 
first_name: String, 
last_name: String 
id: { 
type: mongoose.Schema.Types.ObjectId, 
ref: 'Product' 
} 
}) 

mongoose.model('User', UserSchema) 
+0

哪个节点模块'db'? – Sangharsh

+0

如果你正在使用Mongoose,那么你可以使用模式方法,所以你应该能够在模型对象上使用'.populate' –

+0

@Sangharsh我已经添加了如何将db设置为代码顶部 –

回答

0

类别没有猫鼬的模型API包括.populate。您应该使用您在猫鼬身上注册的模型,而不是直接使用集合。

var schema = new mongoose.Schema(...); 
 

 
var User = mongoose.model('User', schema); 
 
// you can also get the model after it was registered via mongoose.model('User') 
 

 
app.get('/api/users/:id', (req, res) => { 
 
User.findOne({ id: (req.params.id) }).populate('product'), (err, doc) => { 
 
    if (err) handleError(res, err.message, 'Failed to get user') 
 

 
    res.status(200).json(doc) 
 
    console.log(req.params) 
 
} 
 
})

+0

伟大,我会试试这个。我最初的错误是“用户没有定义”,所以我认为我的架构设置不正确。我现在来看看。谢谢! –

+0

我认为你得到这个错误只是因为你没有在这个确切的文件中定义变量。使用'var User = mongoose.model('User')'(或者你注册模式的名字)。 –

+0

我在我的第一篇文章中加入了我认为是其他相关代码片断的内容。感谢您的帮助 –

相关问题