Почему передача req.params в поисковом запросе не работает в node js / mongo - PullRequest
0 голосов
/ 02 августа 2020

Прежде всего, это файлы:

MySchema File, который также имеет две ссылочные переменные

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// Creating Schema
const userShelfSchema = new Schema({
    user:{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'userModel'
    },
    bookShelf:[{
        bookId:{
            type: mongoose.Schema.Types.ObjectId,
            ref: 'bookDetailsModel'
        },
        status:{
            type: String
        },
        rating:{
            type: Number
        },
        review:{
            type: String
        },
        date:{
            type: Date,
            default: Date.now 
        }
   }]
})

module.exports = userShelfModel = mongoose.model('userShelfModel', userShelfSchema);

Итак, я хочу найти всех пользователей, у которых есть спецификация c book в их массиве bookShelf, поэтому в моей bookdetails есть следующий код. js:

router.get('/reviews/:bookid', (req, res) =>{


   userShelf.find({bookShelf:{bookId:req.params.bookid}})
            .populate('user',['name']) 
            .then(reviews=>{
                return res.json({reviews});
            })
            .catch(err=>res.status(400).json({error:"server error"}));
        
});

Я не получаю здесь ошибок, но я продолжаю получать нулевой массив, я посмотрел на Mon go docs, но ничего не нашел, также я попытался передать params.bookid как mongoose.Types.ObjectId(), но он также возвращает нулевое значение. что мне следует изменить в моем коде? помогите пожалуйста.

1 Ответ

0 голосов
/ 04 августа 2020

Хорошо, я много чего пробовал, но не смог найти идеального решения, проблема в том, что BookId - это объект, а req.params.bookid - это строка, и результат их сравнения всегда ложный. , поэтому вместо того, чтобы найти bookId с помощью метода find () Mon go, я написал свой собственный logi c, чтобы получить отзывы от BookId, я знаю, что это не идеальное решение и только обходной путь, так что пока кто-то в будущем найдет ответ на этот вопрос, я отмечу его как правильный ответ, так что вот код в любом случае:

router.get('/reviews/:bookid', (req, res) =>{
   userShelf.find()
            .then(result=>{
                reviews=[];
                for(i=0;i<result.length;i++){
                    reviews[i] = result[i].bookShelf.map((x=>{
                        if(x.bookId.toString() === req.params.bookid){
                            return x.review;
                        }
                        else
                            {
                                return null;
                            }
                        }));
                }
                finalreviews = reviews.flat().filter(x=>x);
                return res.json({finalreviews});
            })
            .catch(err=>res.status(400).json({error:"server error"}));
        
});
...