我有一个 Express/Mongo 健康跟踪应用程序的后端 API。
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 字段,可以为该用户指定一个默认单位。如果该用户在未指定单位的情况下发布了 weightIn,则该 weightIn 应使用用户的 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 的 create 方法中轻松地做到这一点,但这似乎充其量不是最佳实践,最坏的情况是反模式。
// 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')
子文档的中间件中。我也看不到在子文档中间件中引用父文档的方法。
注意:这个答案不起作用,因为我不想覆盖所有用户的 WeighIns 单位,只是在POST
请求中未指定时。
我是否被困在我的控制器中?我从 Rails 开始,所以我的大脑上刻有“胖模型,瘦控制器”。