私は以下のスキーマを持っています(coffeescriptにあることをおologiesびします)
_Schema = mongoose.Schema
AuthS = new Schema
auth: {type: String, unique: true}
nick: String
time: Date
Auth = mongoose.model 'Auth', AuthS
_
私は単に私のデータベースにある1つのレコードを回復したいだけです:
_Auth.findOne({nick: 'noname'}, function(obj) { console.log(obj); });
_
残念ながら、これは常にnull
を記録します。 mongo Shellのdb.auths.findOne({nick: 'noname'})
は常に値を返します。何が起こっている?
問題が見つかりました。代わりにfunction(err,obj)
を使用する必要があります。
Auth.findOne({nick: 'noname'}, function(err,obj) { console.log(obj); });
Mongooseは基本的にmongodbのapiをラップして擬似リレーショナルdb apiを提供するため、クエリはmongodbクエリとまったく同じにはなりません。 MongoosefindOnequeryはクエリオブジェクトを返しますdocumentではありません。ソリューションが示唆するようにコールバックを使用するか、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();
サードパーティのpromiseライブラリを使用する場合は、 docs を参照してください。
console.log
組み込みの「引数」オブジェクト:
console.log(arguments); // would have shown you [0] null, [1] yourResult
これは、引数の数に関係なく、常にすべての引数を出力します。
Obj [0] .nickを使用すると、望ましい結果が得られます。
私の場合、同じエラーがあります、Asyanc/Await関数を使用しています、これはfindOneにAWAITを追加する必要があるためです
Ex:const foundUser = User.findOne ({ "email" : req.body.email });
上記の場合、findOneは、findOneを終了する前に値を返すため、ユーザーが見つかったかどうかにかかわらず、常にObject値を含みます。
const foundUser = await User.findOne ({ "email" : req.body.email });
上記の条件で、ユーザーがコレクションに存在しない場合、foundUserはnullを返します。ユーザーが見つかった場合、ユーザードキュメントが返されます。