У меня есть много конечных точек в моем экспресс-приложении, которые имеют много условий.Я хочу найти лучший шаблон дизайна для них, не повторяя при этом слишком много.
Это один из моих простых маршрутов:
router.post('/reset/:token',
asyncMiddleware(async(req, res, next) => { await reset(req, res, next, pino); })
);
Внутри reset()
Мне нужно проверитьпара вещей, например:
- Если есть все необходимые параметры тела
- Если электронное письмо с расшифрованным токеном совпадает с письмом из базы данных
- Еслипароль был успешно сохранен.
Я хотел бы проверить те условия, которые не имеют огромной функции, но я не знаю, что лучший способ сделать это.
Весь код маршрута
export async function reset(req, res, next) {
const email = req.body.email;
if (!email) return res.status(400).json(Error.paramsMissing('email'));
const user = await userAssociatedWithEmail(req.body.email);
if (!user) {
return res.status(501).json(Error.noActiveUserAssociatedWithEmail);
}
// Generate token
const token = await jwt.sign({ email: user.email, id: user.id }, 'shhhhh');
const emailSent = await sendForgotEmail(token, user);
if (!emailSent) return res.status(500).json(Error.emailNotSent);
else return res.json({ status: 'success', message: 'Email sent successfully.' });
}
Что я хотел бы сделать
Конечный результат Я хотел бы получить
export async function reset(req, res, next) {
const email = req.body.email;
if (!email) return res.status(400).json(Error.paramsMissing('email'));
// If error inside userAssociatedWithEmail, I'd like to stop execution and
// return res.status(501).json(Error.noActiveUserAssociatedWithEmail) from inside
// that function, without having to add an if condition below as exists in the
// original code above
const user = await userAssociatedWithEmail(req.body.email);
const token = await jwt.sign({ email: user.email, id: user.id }, 'shhhhh');
// Again I'd like to return res.status(500).json(Error.emailNotSent)
// from inside sendForgotEmail IF there is an error
const emailSent = await sendForgotEmail(token, user);
// If everything is successful, finally I'd return this
return res.json({ status: 'success', message: 'Email sent successfully.' });
}
Объяснениерезультат в слове:
Я бы хотел иметь возможность обрабатывать условия и сценарии без необходимости обрабатывать их в основной функции reset
, если это возможно (иначе, без необходимости хранить ответ в переменнойпроверьте переменную и return
в основной функции в случае ошибки).
Так, например, вместо:
const allParamsAreValid = validParams(token, email, new_password, res);
if (!allParamsAreValid) return;
Я хотел бы сделать что-то вроде:
validateParams(token, email, new_password, res);
А затем внутри validateParams()
, если параметр отсутствует, я бы принудительно вышел из программы, кроме того, установив ответ с помощью res.json({})
.
Возможно ли это?