Почему мои мошенники и установщики схемы Mongoose 3.8.7 игнорируются?

Во время работы с Node.js, Mongoose и MongoDB, я обнаружил, что мои мошенники и сеттеры схемы Mongoose не срабатывают при выполнении запроса findOne.

Я нашел старый поток, который говорит о наличии проблемы с getters и seters в версии 2.x, но он утверждает, что с тех пор он был разрешен, и я использую самую последнюю версию Mongoose (3.8.7).

Здесь часть моей схемы

function testGetter(value) {
        return value + " test";
}

/**
* Schema
*/

var schema = new Schema({
        username: { type: String, required: true, unique: true, get: testGetter }
});

// I have also tried this.

schema.path('username').get(function (value, schemaType) {
        return value + " test";
});

Здесь, как я выполняю запрос

Model
.findOne(conditions, fields, options)
.populate(population)
.exec(function (error, doc) {
        callback(doc, error);
});

Он отвечает значением имени пользователя, которое не имеет "тестового" пост-исправления. Я здесь что-то не так? Любая помощь будет принята с благодарностью!

Дополнительная информация

Это результат поиска:

{
    "username": "Radius"
}

Это значение schema.paths.username.getters после применения одного из двух способов, описанных выше:

[ [Function: testGetter] ]

Ответ 1

У меня была та же проблема, что и геттеры, не изменяя возвращаемые документы при запросе с помощью Mongoose. Чтобы это применимо к каждому запросу, вы можете сделать это:

// Enable Mongoose getter functions
schema.set('toObject', { getters: true });
schema.set('toJSON', { getters: true });

Ответ 2

Предполагаете ли вы, что виртуальные машины не работают, потому что они не отображаются в вашем файле console.log? Если это так, то по дизайну. Виртуальные файлы являются внешними по отношению к вашему фактическому документу, поэтому не печатайте с помощью console.log по умолчанию. Чтобы отобразить их, прочитайте эти документы: http://mongoosejs.com/docs/api.html#document_Document-toObject

Ответ 3

Try

schema.virtual('password').get(function () {
    return this.username;
});

в качестве вашей функции getter, this - это ваш экземпляр вашего объекта, а параметр value здесь не означает значительного значения.

Если вы пишете функцию setter, вам нужно написать this.username = value.