В моем приложении пользователи вводят дату своего рождения, используя отдельные поля месяца, даты и года. Я хотел бы сохранить это как одну дату в базе данных. Я чувствую, что это намного проще, чем я делаю, но я уже спустился на несколько кроличьих норе.
О чем я пытался или думал:
Виртуалы :
Не совсем вариант, так как они не принимают параметры. Мне пришлось бы объединить поля в одно свойство setDate
, и тогда я мог бы просто преобразовать их в Date()
, где бы я ни делал эту комбинацию.
Крючок для предварительного сохранения :
Поля
Мои dobDay
, dobMonth
и dobYear
недоступны в this
, поскольку они не соответствуют полям в документе.
Метод экземпляра :
UserSchema.methods.formatDob = function (day, month, year) {
let dob = new Date( parseInt(year), parseInt(month) - 1, parseInt(day), 0, 0, 0, 0 );
return new Date(dob, '<YYYY-MM-DD>');
}
Это будет работать концептуально для моего маршрута редактирования, но не для моего маршрута создания.
exports.register = async function(req, res, next) {
try {
// instance methods not available yet
let user = db.User.create(req.body);
// method now available but too late to modify before inserting
В этом случае, если я захочу вызвать метод экземпляра и сгенерировать отформатированную дату рождения, мне нужно будет позвонить user.save()
, что является ненужной поездкой в базу данных.
Обновление пользователя вручную
const { dobYear, dobMonth, dobDay } = req.body;
const dob = formatDob(dobDay, dobMonth, dobYear);
user = new db.User(); // can't pass in req.body here
// Now I have to manually set all the fields!
...
user.dob = dob;
user.save();
Поскольку я не могу передать req.body
в новый db.User()
, как я могу с db.User.create()
, я должен добавить поля вручную. Там должен быть лучший путь. Как другие люди делают это?