Mongoose.js findOne返回查询元数据

我正在试图在我的数据库上运行一个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] } 

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

尝试这个:

 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(); } }); } 

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

要调用findUser函数,需要传递一个callback,如下所示:

 findUser('adam@gmail.com', function(error, userFound) { console.log(userFound); }); 

你可以在这里find关于Mongoose findOne的更多细节,并了解callback函数,你可以在这里看看

你所看到的是return foundUser (一个Mongoose查询对象)的结果。

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

 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) }); 

为了快速介绍callback,这是什么是callback函数开始的链接?