2015-09-04 65 views
3

我有這樣定義的模型貓鼬的包裝對象:Model.findOne不返回文檔,但返回

var mongoose = require("mongoose") 
var Schema = mongoose.Schema 

var userObject = Object.create({ 
    alias: String, 
    email: String, 
    password: String, 
    updated: { 
     type: Date, 
     default: Date.now 
    } 
}) 

var userSchema = new Schema(userObject, {strict: false}) 
var User = mongoose.model('User', userSchema) 

module.exports = User 

然後,我創建了我可以通過蒙戈控制檯完美地找到這樣一個用戶:

db.users.findOne({ email: "[email protected]" }); 
{ 
    "_id" : ObjectId("55e97420d82ebdea3497afc7"), 
    "password" : "caff3a46ebe640e5b4175a26f11105bf7e18be76", 
    "gravatar" : "a4bfba4352aeadf620acb1468337fa49", 
    "email" : "[email protected]", 
    "alias" : "coco", 
    "updated" : ISODate("2015-09-04T10:36:16.059Z"), 
    "apps" : [ ], 
    "__v" : 0 
} 

然而,當我試圖通過與貓鼬使Node.js訪問該對象,該對象的獲取不是這樣的文件,但包裝:

這段代碼...

// Find the user for which the login queries 
    var User = require('../models/User') 
    User.findOne({ email: mail }, function(err, doc) { 
    if (err) throw err 
     if (doc) { 
     console.dir(doc) 
     if(doc.password == pass) // Passwords won't match 

可生產從console.dir(DOC)這個輸出...

{ '$__': 
    { strictMode: false, 
    selected: undefined, 
    shardval: undefined, 
    saveError: undefined, 
    validationError: undefined, 
    adhocPaths: undefined, 
    removing: undefined, 
    inserting: undefined, 
    version: undefined, 
    getters: {}, 
    _id: undefined, 
    populate: undefined, 
    populated: undefined, 
    wasPopulated: false, 
    scope: undefined, 
    activePaths: { paths: [Object], states: [Object], stateNames: [Object] }, 
    ownerDocument: undefined, 
    fullPath: undefined, 
    emitter: { domain: null, _events: {}, _maxListeners: 0 } }, 
    isNew: false, 
    errors: undefined, 
    _doc: 
    { __v: 0, 
    apps: [], 
    updated: Fri Sep 04 2015 12:36:16 GMT+0200 (CEST), 
    alias: 'coco', 
    email: '[email protected]', 
    gravatar: 'a4bfba4352aeadf620acb1468337fa49', 
    password: 'caff3a46ebe640e5b4175a26f11105bf7e18be76', 
    _id: { _bsontype: 'ObjectID', id: 'Uét Ø.½ê4¯Ç' } }, 
    '$__original_validate': { [Function] numAsyncPres: 0 }, 
    validate: [Function: wrappedPointCut], 
    _pres: { '$__original_validate': [ [Object] ] }, 
    _posts: { '$__original_validate': [] } } 

因此,密碼不匹配,因爲doc.password是不確定的。

這是爲什麼造成的?

+1

使用'console.log',而不是'console.dir'來正常記錄Mongoose模型實例。 – JohnnyHK

+0

是的,作爲一個事實'console.log(doc)'只打印包裝文檔,但密碼驗證仍然不起作用,並且'doc.password'仍然返回'undefined'而沒有'console.dir(doc)'。 – jsdario

回答

5

這正是貓鼬的目的,包裹蒙戈物體。這就是爲您的文檔提供調用貓鼬方法的能力。如果你喜歡簡單的物體,你可以打電話.toObject()或使用lean query,如果你不打算使用任何貓鼬的魔法。話雖如此,平等檢查仍應保持爲doc.password返回doc._doc.password

+0

太好了。有效!真的非常感謝。你知道爲什麼在幾個教程和片段 - 像[這是一個在貓鼬的文檔](http://mongoosejs.com/docs/queries.html) - 方法'.toObject()'不使用? – jsdario

+0

這不是必要的。如果你使用貓鼬,很可能你需要貓鼬文件。 – cdbajorin

+0

對不起,我堅持要完全理解;在[鏈接示例](http://mongoosejs.com/docs/queries.html)中,mongoose對象用於直接訪問**以**文檔參數(如'person.occupation')。在我的情況下,這是行不通的,因爲'doc.password'總是返回'undefined',除非我先應用'.toObject()'。 – jsdario