Cal*_*ers 38 mongoose mongodb node.js coffeescript
我有以下架构(道歉,它是在coffeescript)
Schema = mongoose.Schema
AuthS = new Schema
auth: {type: String, unique: true}
nick: String
time: Date
Auth = mongoose.model 'Auth', AuthS
Run Code Online (Sandbox Code Playgroud)
我只想恢复一条肯定在我的数据库中的记录:
Auth.findOne({nick: 'noname'}, function(obj) { console.log(obj); });
Run Code Online (Sandbox Code Playgroud)
很不幸,这始终记录null.db.auths.findOne({nick: 'noname'})在mongo shell中总是返回一个值.到底是怎么回事?
Cal*_*ers 82
发现问题,需要function(err,obj)改用:
Auth.findOne({nick: 'noname'}, function(err,obj) { console.log(obj); });
Run Code Online (Sandbox Code Playgroud)
Isa*_*Pak 12
Mongoose 基本上包装了 mongodb 的 api,为您提供一个伪关系数据库 api,因此查询不会与 mongodb 查询完全一样。Mongoose 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();
Run Code Online (Sandbox Code Playgroud)
如果您想使用第三方承诺库,请参阅文档。
在我的情况下,存在同样的错误,我使用的是 Asyanc/Await 函数,为此需要为 findOne 添加 AWAIT
Ex:const foundUser = User.findOne ({ "email" : req.body.email });
Run Code Online (Sandbox Code Playgroud)
上面, foundUser 在两种情况下都包含 Object 值,无论是用户找到还是没有找到,因为它在完成 findOne 之前返回值。
const foundUser = await User.findOne ({ "email" : req.body.email });
Run Code Online (Sandbox Code Playgroud)
上面,如果用户不在集合中并提供条件,则 foundUser 返回 null。如果用户找到,则返回用户文档。
| 归档时间: |
|
| 查看次数: |
96410 次 |
| 最近记录: |