Mongoose.js findOne返回查询元数据

时间:2016-11-30 20:07:53

标签: node.js mongodb mongoose mongoose-schema

我正在尝试在我的数据库上运行mongoose.findOne,但是我得到了意想不到的结果。我的查询是

const User = mongoose.model('User', {name: String, email: String, passwordHash: String, validation: String, validationCode: String, favorites: Array })


exports.findUser = function findUser(email){

    const foundUser = User.findOne({email: email}, function(err, userObj){
        if(err){
            return err
        }       else if (userObj){
            return userObj
        }       else{
            return null
        }
    })

    return foundUser
}

但是这会返回以下数据(看似随机?)并且没有我请求的数据

Query {
  _mongooseOptions: {},
  mongooseCollection: 
   NativeCollection {
     collection: null,
     opts: { bufferCommands: true, capped: false },
     name: 'users',
     collectionName: 'users',
     conn: 
      NativeConnection {
        base: [Object],
        collections: [Object],
        models: [Object],
        config: [Object],
        replica: false,
        hosts: null,
        host: 'ds113938.mlab.com',
        port: 13938,
        user: 'root',
        pass: 'root',
        name: 'users',
        options: [Object],
        otherDbs: [],
        _readyState: 2,
        _closeCalled: false,
        _hasOpened: false,
        _listening: false,
        db: [Object] },
     queue: [],
     buffer: true,
     emitter: 
      EventEmitter {
        domain: null,
        _events: {},
        _eventsCount: 0,
        _maxListeners: undefined } },
  model: 
   { [Function: model]
     hooks: Kareem { _pres: {}, _posts: {} },
     base: 
      Mongoose {
        connections: [Object],
        plugins: [],
        models: [Object],
        modelSchemas: [Object],
        options: [Object] },
     modelName: 'User',
     model: [Function: model],
     db: 
      NativeConnection {
        base: [Object],
        collections: [Object],
        models: [Object],
        config: [Object],
        replica: false,
        hosts: null,
        host: 'ds113938.mlab.com',
        port: 13938,
        user: 'root',
        pass: 'root',
        name: 'users',
        options: [Object],
        otherDbs: [],
        _readyState: 2,
        _closeCalled: false,
        _hasOpened: false,
        _listening: false,
        db: [Object] },
     discriminators: undefined,
     schema: 
      Schema {
        obj: [Object],
        paths: [Object],
        subpaths: {},
        virtuals: [Object],
        singleNestedPaths: {},
        nested: {},
        inherits: {},
        callQueue: [Object],
        _indexes: [],
        methods: {},
        statics: {},
        tree: [Object],
        _requiredpaths: undefined,
        discriminatorMapping: undefined,
        _indexedpaths: undefined,
        query: {},
        childSchemas: [],
        s: [Object],
        options: [Object],
        '$globalPluginsApplied': true },
     collection: 
      NativeCollection {
        collection: null,
        opts: [Object],
        name: 'users',
        collectionName: 'users',
        conn: [Object],
        queue: [],
        buffer: true,
        emitter: [Object] },
     Query: { [Function] base: [Object] },
     '$__insertMany': [Function],
     insertMany: [Function] },
  schema: 
   Schema {
     obj: 
      { name: [Function: String],
        email: [Function: String],
        passwordHash: [Function: String],
        validation: [Function: String],
        validationCode: [Function: String],
        favorites: [Function: Array] },
     paths: 
      { name: [Object],
        email: [Object],
        passwordHash: [Object],
        validation: [Object],
        validationCode: [Object],
        favorites: [Object],
        _id: [Object],
        __v: [Object] },
     subpaths: {},
     virtuals: { id: [Object] },
     singleNestedPaths: {},
     nested: {},
     inherits: {},
     callQueue: [ [Object], [Object], [Object], [Object] ],
     _indexes: [],
     methods: {},
     statics: {},
     tree: 
      { name: [Function: String],
        email: [Function: String],
        passwordHash: [Function: String],
        validation: [Function: String],
        validationCode: [Function: String],
        favorites: [Function: Array],
        _id: [Object],
        id: [Object],
        __v: [Function: Number] },
     _requiredpaths: undefined,
     discriminatorMapping: undefined,
     _indexedpaths: undefined,
     query: {},
     childSchemas: [],
     s: { hooks: [Object], kareemHooks: [Object] },
     options: 
      { retainKeyOrder: false,
        typeKey: 'type',
        id: true,
        noVirtualId: false,
        _id: true,
        noId: false,
        validateBeforeSave: true,
        read: null,
        shardKey: null,
        autoIndex: null,
        minimize: true,
        discriminatorKey: '__t',
        versionKey: '__v',
        capped: false,
        bufferCommands: true,
        strict: true,
        pluralization: true },
     '$globalPluginsApplied': true },
  op: 'findOne',
  options: { retainKeyOrder: false },
  _conditions: { email: 'Adam@gmail.com' },
  _fields: undefined,
  _update: undefined,
  _path: undefined,
  _distinct: undefined,
  _collection: 
   NodeCollection {
     collection: 
      NativeCollection {
        collection: null,
        opts: [Object],
        name: 'users',
        collectionName: 'users',
        conn: [Object],
        queue: [],
        buffer: true,
        emitter: [Object] },
     collectionName: 'users' },
  _traceFunction: undefined,
  _castError: null,
  _count: [Function],
  _execUpdate: [Function],
  _find: [Function],
  _findOne: [Function],
  _findOneAndRemove: [Function],
  _findOneAndUpdate: [Function] }

我想知道如何解决这个问题,这似乎是我试图运行的查询的概述,而不是所述查询的结果

5 个答案:

答案 0 :(得分:5)

试试这个:

y=y-10, y+10

当你执行User.findOne时,mongoose调用mongodb并在回调中返回你的用户(findOne函数中的最后一个参数),这样就可以返回找到的用户调用回调。

要调用const User = mongoose.model('User', {name: String, email: String, passwordHash: String, validation: String, validationCode: String, favorites: Array }) exports.findUser = function findUser(email, callback){ User.findOne({email: email}, function(err, userObj){ if(err){ return callback(err); } else if (userObj){ return callback(null,userObj); } else { return callback(); } }); } 函数,您需要传递回调,如下所示:

findUser

您可以找到有关Mongoose findOne here的更多详细信息,并了解回调函数,您可以查看here

答案 1 :(得分:1)

您所看到的是return foundUser(一个Mongoose Query对象)的结果。

您正在混合同步和异步代码,您必须等待执行查询并回调调用它的函数,如下所示:

const User = mongoose.model('User', {name: String, email: String, passwordHash: String, validation: String, validationCode: String, favorites: Array });

exports.findUser = function findUser(email,callback){
    const foundUser = User.findOne({email: email}, (err, userObj)=>{
        if(err){
            callback(err)
        } else if (userObj){
            callback(null,userObj)
        } else {
            callback(new Error('Some strange thing has happened));
        }
    });
}

然后你可以这样调用你的函数:

findUser((err,user)=>{
    if(err) console.log(err);
    console.log(user)
});

要快速了解回调,这是以What is a callback function?

开头的链接

答案 2 :(得分:0)

我最近有同样的问题。

就我而言,尽管在这种情况下该方法必须是异步的,但在运行之前已经制定了解决方案。

如下所示:

async findUser(email,callback){
    const foundUser = await User.findOne({email: email}, (err, userObj)=>{
        if(err){
            callback(err)
        } else if (userObj){
            callback(null,userObj)
        } else {
            callback(new Error('Some strange thing has happened));
        }
    });
}

答案 3 :(得分:0)

问题是您甚至在查询完成之前就返回了 foundUser object。这就是为什么您将查询对象作为响应而不是文档对象。

有错误的代码 ` const User = mongoose.model('User', {name: String, email: String, passwordHash: String, validation: String, validationCode: String, favorites: Array })

exports.findUser = 函数 findUser(email){

const foundUser = User.findOne({email: email}, function(err, userObj){
    if(err){
        return err
    }       else if (userObj){
        return userObj
    }       else{
        return null
    }
})

return foundUser

} `

代码没有错误 const User = mongoose.model('User', {name: String, email: String, passwordHash: String, validation: String, validationCode: String, favorites: Array })

exports.findUser = 函数 findUser(email){

const foundUser = User.findOne({email: email}, function(err, userObj){
    if(err){
        return err
    }       else if (userObj){
        return userObj
    }       else{
        return null
    }
})

}

答案 4 :(得分:0)

只需将您已有的修改为...

{
  ...
  return foundUser.toJSON();
}

这将返回实际的文档/值(没有查询的元数据)。