Проверьте, есть ли идентификатор пользователя в документе mongoose - если да, измените значение свойства на true? - PullRequest
0 голосов
/ 08 октября 2018

У меня есть маршрутизатор expressjs, который просматривает коллекцию MongoDB с помощью метода mongoose findById.Он возвращает объект, где внутри существует массив userHasSelected с идентификатором пользователя.Я не хочу возвращать идентификатор пользователя, но просто проверьте, существуют ли текущие пользователи (тот, кто сделал запрос) в массиве.Если он затем возвращает true вместо возврата идентификатора пользователя.

Промежуточное программное обеспечение verifytoken в маршрутизаторе добавляет свойство запроса идентификатора пользователя в запрос. Этот идентификатор пользователя доступен в сообщении get router - могу ли я как-нибудь передать эток схеме Mongoose ???

// Мой роутер

router.get('/challenge/:challengeId', verifyToken ,function (req, res){
    //+ Return one challenge and its options
    //- Check if userId is set to options and winner properties
    let userId = req.userId;
    console.log(userId);
    let challengeId = req.params.challengeId;

    Challenge.findById(challengeId, (err, suc)=>{
        if(err){
            res.status(304).send(err);
        }
        Challenge.
        res.status(200).send(suc);
    });
})

// И схема мангуста

const mongoose = require('mongoose');

var Schema = mongoose.Schema;

//Optionsschema is use in the ChallengeSchema
var OptionSchema = new Schema({
    name: { type: String},
    isCorrect : { type: Boolean },
    description: { type: String },
    image : { type : String },
    userHasSelected : { type : Object, get : returnUserChallengeStatus}
})

OptionSchema.set('toObject', { getters: true });
OptionSchema.set('toJSON', { getters: true });

var ChallengeSchema = new Schema({
    shortEventId : String,
    organization: String,
    name: String,
    winner: String,
    options : [OptionSchema]
});

ChallengeSchema.set('toObject', { getters: true });
ChallengeSchema.set('toJSON', { getters: true });

ChallengeSchema.virtual('born').get(function(value) {
    return this.name + "plus andet"
});

module.exports = mongoose.model('challenge', ChallengeSchema);

Итак, еще раз - я не хочу возвращатьидентификатор пользователя из массива userHasSelected - просто проверьте, есть ли он там, и если да, используйте метод получения или метод для установки значения в true.

Обновленное объяснение FindById возвращает этот объект / документ

{
    "_id":"5b86dc5bfb6fc03893e55001",
    "shortEventId": "d2d3",
    "organization": "Braedstrup",
    "name": "1. december",
    "winner": "5b864cbaa9ce291b148ddd6d",
    "options": [
        {
            "name": "Matas",
            "isCorrect": "true",
            "description": "Matas er byens førende indenfor pleje og Matas er byens førende indenfor pleje og omsorg Matas er byens førende indenfor pleje og omsorg",
            "image": "https://cityxpstorage.blob.core.windows.net/images/Matas.png",
            "userHasSelected": [
                {
                    "userId": "5b864cbaa9ce291b148ddd6d"
                }
            ]
        },
        {
            "name": "Føtex",
            "isCorrect": "false",
            "description": "Føtex er en dejlig butik",
            "image": "https://cityxpstorage.blob.core.windows.net/images/Føtex.png"
        },
        {
            "name": "Kvickly",
            "isCorrect": "false",
            "description": "Kvickly er en dejlig butik",
            "image": "https://cityxpstorage.blob.core.windows.net/images/Matas.png"
        },
        {
            "name": "MC Jørgensen",
            "isCorrect": "false",
            "description": "MC Jørgensen er en dejlig butik",
            "image": "https://cityxpstorage.blob.core.windows.net/images/Matas.png"
        }
    ],
    "startDate": "2018-10-06T00:00:00.000Z",
    "endDate": "2018-10-06T23:59:00.000Z"
}

Итак, вложенный массив 'userHasSelected' содержит информацию об идентификаторе пользователя.Я не хочу отправлять это - вместо этого я хотел бы {userId: true}.Я читал, что геттеры способны обрабатывать исходящие данные.

Возможное решение

Я мог бы выполнить проверку внутри метода get маршрутизатора перед возвратом объекта клиенту, какthis

// If user is in array set user to true. I would like to move this responsibility to the schema / document.
suc.options.forEach(option => {
    if(Array.isArray(option.userHasSelected))
    option.userHasSelected = {userId : true}
});

Но мне бы очень хотелось, чтобы за это отвечала схема - возможно ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...