У меня есть маршрутизатор 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}
});
Но мне бы очень хотелось, чтобы за это отвечала схема - возможно ли это?