Почему мне пришлось использовать `toObject()` в мангусте, чтобы узнать, есть ли у объекта свойство?

Насколько я понимаю, в JavaScript нет .toObect(), но он используется в мангусте для преобразования документов мангуста в объект, чтобы вы могли использовать встроенные в JavaScript функции.

Я не понимаю, когда его использовать. иногда, когда я получаю массив документов, я могу использовать forEach для возвращаемого массива, а в других случаях я трачу 20 минут на выяснение того, почему forEach не работает. затем я бы добавил .toObject к возвращаемому массиву, и forEach заработал бы. что-то такое. Я не уверен в своей памяти, было ли это для каждого или что-то еще.

В любом случае, это последняя странная проблема. Я работаю в EJS, и мне нужно было сделать <% console.log("typeof", user.toObject().hasOwnProperty("facebook")) %> для работы вместо <% console.log("typeof", user.hasOwnProperty("facebook")) %> . Тот, что с .toObject() консолями: typeof true тот, что без консолей typeof false. Мне это кажется странным. Является ли пользователь документом мангуста? Как я могу использовать .toObject в ejs? О, подожди минутку. Я просто думаю, потому что он находится в «<%%>», он подключается к коду на стороне сервера, и, возможно, мне требуется мангуст в моем server.js Почему я должен использовать toObject для получения значения true?

в любом случае я не думал, что мне нужно использовать .toObject()

Вот что у меня есть в моем файле .js: res.render("editProfile", {aboutUser : returnedUser, user : req.user}); Я думаю, что req.user из паспорта, а не мангуста.

объект пользователя

{ _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.


person jack blank    schedule 02.11.2016    source источник
comment
Mongoose представляет схемы MongoDB. Единственные свойства, которые реализуют объекты Mongoose, — это свойства, предоставляемые API-интерфейсами mongoose. Они не представляют фактические объекты JavaScript. Чтобы получить реальный объект JavaScript, вам нужно вызвать (как ни странно) toObject(). И я думаю, может быть, нам нужно меньше деталей   -  person Tibrogargan    schedule 03.11.2016
comment
Mongoose действительно возвращает объект, но, скорее всего, это курсор, а не объект данных, который вам нужен. Если вы добавите фактический вопрос и покажете нам, как вы получаете этот объект, это будет проще.   -  person adeneo    schedule 03.11.2016
comment
req.user предоставляется по паспорту. Я считаю, что это нормально, и передаю это ejs. поэтому я удивлен, что мне нужно использовать toObject. Этот парень упоминает о проблеме с toObject. Мне интересно, может ли это вызывать у меня проблемы. stackoverflow.com/a/39019417/1893672   -  person jack blank    schedule 03.11.2016
comment
Это так странно, потому что я смог получить доступ к данным, выполнив что-то вроде user.facebook, но я не мог использовать hasOwnProperty без toObject(), и если бы я просто выполнил проверку условия с помощью user.facebook, это дало бы мне false, неправильный ответ.   -  person jack blank    schedule 03.11.2016


Ответы (1)


Вам нужно .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); 
    });
});
person Medet Tleukabiluly    schedule 03.11.2016