У меня есть внутренний API для приложения отслеживания работоспособности Express / Mongo.
У каждого пользователя есть массив weighIns
, вложенные документы, содержащие значение, единицу измерения и дату записи.Если единица не указана, то по умолчанию используется значение 'lb'
.
const WeighInSchema = new Schema({
weight: {
type: Number,
required: 'A value is required',
},
unit: {
type: String,
default: 'lb',
},
date: {
type: Date,
default: Date.now,
},
});
У каждого пользователя также есть поле defaultUnit, в котором можно указать единицы измерения по умолчанию для этого пользователя.Если этот пользователь отправляет взвешивание без указания единицы измерения, то взвешивание должно использовать значение defaultUnit пользователя, если оно присутствует, или значение по умолчанию 'lb'
.
const UserSchema = new Schema({
email: {
type: String,
unique: true,
lowercase: true,
required: 'Email address is required',
validate: [validateEmail, 'Please enter a valid email'],
},
password: {
type: String,
},
weighIns: [WeighInSchema],
defaultUnit: String,
});
Где находится правильное расположение для этой логики?
Я легко могу сделать это в методе создания моего WeighInsController, но в лучшем случае это не лучшая практика, а в худшем - антишаблон.
// WeighInsController.js
export const create = function create(req, res, next) {
const { user, body: { weight } } = req;
const unit = req.body.unit || user.defaultUnit;
const count = user.weighIns.push({
weight,
unit,
});
user.save((err) => {
if (err) { return next(err); }
res.json({ weighIn: user.weighIns[count - 1] });
});
};
Кажется невозможным указать ссылку народительский документ в схеме Mongoose, но я думаю, что лучшая ставка была бы в моем промежуточном программном обеспечении pre('validate')
для поддокумента.Я просто не вижу способа сослаться на родительский документ в промежуточном программном обеспечении под-документа.
NB: Этот ответ не работает, так как я не хочу переопределять всех пользователейЕдиницы взвешивания, только когда они не указаны в запросе POST
.
Я застрял, делая это в моем контроллере?Я начал с Rails, поэтому на моем мозгу выгравированы «жирные модели, тощие контроллеры».