_最初:この問題を克服するための回避策:_
Model.findOne({id: 'blabla'}).select('email password createdAt').lean().exec()
Users
モデルでcreatedAt
フィールド(有効期限(TTL 24h
)とデフォルト( Date.now
)の値)を使用して、作成を保存します新しく作成されたユーザーの日付情報。
ユーザーがアカウントをアクティブ化すると、システムはcreatedAt
フィールドを削除します。
ユーザーがアカウントをアクティブ化しない場合、システムは24時間後にUsers
コレクションからアカウントを削除します。
認証操作では、最初にcreatedAt
フィールドの存在を確認します。
ユーザーがアクティブ化されていない場合、 Account is not activated.
ようなメッセージが表示されます
上記の認証手順の目的でFindOne
メソッドを試すと、ユーザーが自分のアカウントをアクティブ化したため、ドキュメントにcreatedAt
フィールドがないにもかかわらず、 Date.now
値が取得されます。 。
createdAt
User
モデルのcreatedAt
フィールド:
createdAt: { type: Date, expires: '24h', default: Date.now },
私の方法:
Users.findOne({email: username}, 'email, password, createdAt', function(err, user) {
上記のメソッドを使用すると、 createdAt
値が毎回返されます。
ps:問題を検索しましたが、何もできませんでした。
これがデフォルトの仕組みです。ドキュメントにcreatedAt
フィールドがない場合、マングースは1つ追加します。 新しいドキュメントを作成するときにcreatedAt
のみを追加する場合:
schema.pre('save', function(next) {
if (this.isNew) {
this.createdAt = Date.now();
}
next();
});
また、プロジェクションUsers.findOne({email: username}, 'email, password, createdAt' /** <-- remove commas here */)
のフィールドをコンマで区切ることはお勧めしません。
同じ問題に遭遇しました。
@ vkarpov15それはそのようにfind
のときに設定すると誤解を招きますね。 私は問題を再開することに投票します。
必ずしもそうとは限りませんが、マングースには、データベースに格納されている正確なデータをドキュメントが表していない場所がたくさんあります。ゲッター、仮想などです。いずれにせよ、この動作を主張し、変更すると多くの人のコードが破損するためです。変更する必要がない限り、変更しません。 回避策は次のとおりです。
createdAt: {
type: Date,
default: function() {
if (this.isNew) { return new Date(); }
return undefined;
}
}
これにより、 createdAt
はデータベースに保存するときにのみ設定されるようになりますが、データベースからドキュメントをロードし、 createdAt
がロードされていない場合は、 undefined
ます。設定。
最も参考になるコメント
同じ問題に遭遇しました。
@ vkarpov15それはそのように
find
のときに設定すると誤解を招きますね。 私は問題を再開することに投票します。