为什么我必须在mongoose中使用' toObject() '来查找对象是否具有属性?

Why did I have to use `toObject()` in mongoose to find out if an object has a property?

本文关键字:对象 查找 是否 属性 toObject mongoose 为什么      更新时间:2023-09-26

根据我的理解,JavaScript中没有.toObect(),但它在mongoose中用于将mongoose文档更改为对象,因此您可以使用JavaScript内置函数。

我不知道什么时候用它。有时当我得到一个文档数组时,我可以在返回的数组上使用forEach,然后其他时候我会花20分钟弄清楚为什么forEach不起作用。然后我将.toObject添加到返回的数组和forEach将工作。差不多就是这样。我不确定我的记忆是forEach还是别的什么。

不管怎样,这是最新的奇怪问题。我在EJS,我需要做<% console.log("typeof", user.toObject().hasOwnProperty("facebook")) %>工作,而不是<% console.log("typeof", user.hasOwnProperty("facebook")) %>。有.toObject()控制台的:typeof true,没有控制台的typeof false。我觉得很奇怪。用户是猫鼬文档吗?如何在js中使用。object ?哦,等一下。我只是在想,是因为它是在"<%%>"它连接到服务器端代码,也许我有猫鼬需要在我的server.js 为什么我要使用toObject来获得true?

我认为我不需要使用.toObject()

这就是我在我的。js文件:res.render("editProfile", {aboutUser : returnedUser, user : req.user});我认为req.user是从护照不是猫鼬。

用户obj

{ _id: 581a2chan3changed727, defaultImage: 'https://scontefrfrxxffbcdn.net/v/t1.0-1/s148x148/29731_575634691740_1085883_n.jpg?oh=797bc81addf3611309changedoe=588AC839', urlname: 'Jacchanged', momented: 'Nov 2, 2016', username: 'Jack Schuldenfrei', __v: 0, usefulness: [], createdOn: Wed Nov 02 2016 14:15:47 GMT-0400 (Eastern Daylight Time), shortId: 'rkn8powgl', pointsRecord: [], repPoints: 0, facebook: { posts: '{"email":"jschuldenfreiGTGTGTgchanged,"name":"Jack Schuchange","gender":"male","picture":{"data":{"height":148,"is_silhouette":false,"url":"https:''/''frfr.net''/v''/t1.0-1''/s148x148''/29731_575634691740_1fr5883_n.jpg?oh=797bc81addf36113e0933a67eef32ab9&oe=588AC839","width":93}},"id":"10100584555845400"}', gender: 'male', email: 'jschuldenfredu', name: 'Jack changes', token: 'EAAPs693O1UMBAHwTcyZAPtRiXrwvxrBWhGCJZCQlAIfHRZAiCLY3tYDVoviB4yDrK68WrsUnuxlcHfUJE984aAvWOnFZASqbUjYZAhHnsL0mFCZCNRQwsn3oJn1acu1qnSPFko6I3ShZAtPIMumrVlpVxR0ZD', id: '1010058386584400' }, reviews: [] } { _id: 581a2d53380e4c70ac728, userId: 581a2d380e4c7037aac727, username: 'Jack changed', urlname: 'Jachanged', __v: 0, question1: { name: 'This is for question1' } }

我通过在ejs文件中执行<%=user%>来获取用户对象。

你想要的是.lean()

通常passport的序列化配置看起来像

// Serialize sessions
passport.serializeUser(function (user, done) {
    done(null, user.id);
});
// Deserialize sessions
passport.deserializeUser(function (id, done) {
    User.findOne({
        _id: id
    }, '-salt -password', function (err, user) {
        done(err, user);
    });
});

更改反序列化过程,如

// Deserialize sessions
passport.deserializeUser(function (id, done) {
    User.findOne({
        _id: id
    }, '-salt -password')
    .lean() // lean converts mongoose.Document to Plain Javascript Object
    .exec(function (err, user) {
        console.log(user instanceof mongoose.Document) // false
        done(err, user); 
    });
});