我有以下架构(道歉,它在coffeescript中)
Schema = mongoose.Schema
AuthS = new Schema
auth: {type: String, unique: true}
nick: String
time: Date
Auth = mongoose.model 'Auth', AuthS
我只想恢复一条肯定在我的数据库中的记录:
Auth.findOne({nick: 'noname'}, function(obj) { console.log(obj); });
不幸的是,这总是记录null
。 mongo shell中的db.auths.findOne({nick: 'noname'})
始终返回一个值。到底是怎么回事?
答案 0 :(得分:76)
发现问题,需要使用function(err,obj)
代替:
Auth.findOne({nick: 'noname'}, function(err,obj) { console.log(obj); });
答案 1 :(得分:2)
您可能需要考虑将console.log
与内置的“arguments”对象一起使用:
console.log(arguments); // would have shown you [0] null, [1] yourResult
无论你有多少个参数,这都会输出你的所有参数。
答案 2 :(得分:2)
Mongoose基本上包装了mongodb的api,以便为您提供伪关系数据库api,因此查询不会完全像mongodb查询一样。猫鼬 findOne 查询返回查询对象,不是文档。您可以根据解决方案的建议使用回调,也可以从v4 +开始使用 findOne 返回thenable,以便可以使用.then或await / async来检索文档。
// thenables
Auth.findOne({nick: 'noname'}).then(err, result) {console.log(result)};
Auth.findOne({nick: 'noname'}).then(function (doc) {console.log(doc)});
// To use a full fledge promise you will need to use .exec()
var auth = Auth.findOne({nick: 'noname'}).exec();
auth.then(function (doc) {console.log(doc)});
// async/await
async function auth() {
const doc = await Auth.findOne({nick: 'noname'}).exec();
return doc;
}
auth();
如果您想使用第三方承诺库,请参见docs。
答案 3 :(得分:0)
使用obj [0] .nick,你会得到想要的结果,
答案 4 :(得分:0)
对于我来说,同样的错误也存在,我正在使用Asyanc / Await函数,因为这需要为findOne添加AWAIT
Ex:const foundUser = User.findOne ({ "email" : req.body.email });
在上述两种情况下,无论是否找到用户,foundUser始终都包含Object值,因为它在完成findOne之前会返回值。
const foundUser = await User.findOne ({ "email" : req.body.email });
以上,如果用户不在提供条件中的集合中,则FoundUser返回null。如果找到用户,则返回用户文档。