2017-02-20 57 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

我在我的第一篇文章中加入了我認爲是其他相關代碼片斷的內容。感謝您的幫助 –

相關問題