I got some error that says 'Cannot do inclusion on field guides in exclusion projection', this happen bcs I tried to populate data using pre middleware in my schema:
const tourSchema = new mongoose.Schema({
...
guides: [
{
type: mongoose.Schema.ObjectId,
ref: 'User'
}
]
});
tourSchema.pre(/^find/, function(next) {
this.populate({ path: 'guides' });
next();
});
but the error happen only when accessing getAllTour handlers when access only specified tour the error does not showed up
// Errors happens here
exports.getAllTours = catchAsync(async (req, res, next) => {
const features = new APIFeatures(Tour.find(), req.query)
.filter()
.sort()
.limitFields()
.paginate();
const tours = await features.query;
res.status(200).json({
status: 'success',
length: tours.length,
data: {
tours
}
});
});
// But in here there is no error
exports.getTour = catchAsync(async (req, res, next) => {
const tour = await Tour.findById(req.params.id);
if (!tour) {
return next(
new AppError('No tour found! please check the ID correctly', 404)
);
}
res.status(200).json({
status: 'success',
requestedAt: req.requestTime,
data: {
tour
}
});
});
you can also check my code in this link
Solutions for my errors
After debugging my code from previous answer, the errors is gone by made little bit changes from limitFields()
:
else if (this.queryString._fieldsForExec) {
const fields = this.query
._fieldsForExec()
.filter(f => !['createdAt', '_id', '__v'].includes(f));
this.query = this.query.select(fields);
}
return this;
by adding this.queryString._fieldsForExec
as a parameter, this can get rid of the undefined
from .filter
.