javascript - 为什么我必须在 mongoose 中使用 `toObject()` 来确定对象是否具有属性?

标签 javascript node.js express mongoose ejs

据我了解,没有 .toObect()在 JavaScript 中,但它在 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 。这对我来说似乎很奇怪。用户是 Mongoose 文档吗?我如何在ejs中使用.toObject?哦,等一下。我只是想是因为它在“<%%>”中,它连接到服务器端代码,也许我的server.js中需要 Mongoose 。 为什么我必须使用 toObject 来获取 true

我认为不需要使用 .toObject() 的任何方式

这是我的 .js 文件中的内容:res.render("editProfile", {aboutUser : returnedUser, user : req.user});我认为req.user是来自护照而不是 Mongoose 。

用户对象

{ _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' } }

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

最佳答案

你想要的是.lean()

通常护照有一个序列化配置,看起来像

// 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); 
    });
});

关于javascript - 为什么我必须在 mongoose 中使用 `toObject()` 来确定对象是否具有属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40391330/

相关文章:

javascript - Node.js Express 不会提供绝对 URL .js 文件

javascript - 如何在chrome扩展中将popup.html调整为全屏

javascript - 如何从 YouTube iframe 获取 YouTube 缩略图?

javascript - Three.js 敌人向玩家移动

javascript - 将二进制字符串写入图像文件

javascript - 使用 webpack、less-loader 和 vuejs 无法识别输入

javascript - 单击调整 Canvas 图像的大小并使用 javascript 将其居中

node.js - 如何获取在 CloudFoundry 中运行的 Node-Express 应用程序使用的实例内存?

node.js - 如何在 Express 中使用 Jeet?

javascript - 存活时保留 Node 应用程序的数据