Я разрабатываю API-интерфейс на основе Node.js Express и пытаюсь ответить на вопрос, не является ли использование нескольких бросков (исключений) в одном методе Service антипаттерном.
Я использую шаблон, который можетназываться Router-Controller-Service (или Controller-Service-Model и т. д.)
См. этот высокоуровневый пример:
// router.js
controller = require('controller.js')
app.post('/user/create', controller.create)
// controller.js
service = require('service.js')
i18n = require('i18n')
exports create = (req, res, next) => {
// Input data validator here
try {
await service.create(validated_data) // Calling business layer
res.status(200) // Success
catch (err) {
res.json(i18n.__(err)) // Translated error message
}
}
// service.js
{User, Db} = require('models')
exports create = (data) => {
if(userExistsInDb(data.username, transaction))
throw 'user.create.exists'
newUser = await User.create(data, transaction)
if(!newUser)
throw 'user.create.failedToCreate'
activationToken = generateTokenAndSaveItToDB(transaction)
if(!activationToken)
throw 'user.create.failedToCreateToken'
if(!sendActivationEmail(activationToken))
throw 'user.create.sendEmailFailed'
return newUser
}
Имейте в виду, чтоэто быстрый и высокоуровневый псевдокод объяснения!
Как видите, я бросаю строковые ключи из метода Service create
upper в контроллер, и здесь я обрабатываю его.
I stillесть ощущение, что это анти-паттерн, а если нет, то он, безусловно, плохо написан и не следует передовым методам.
Я хотел бы найти кого-то, кто работает над крупными коммерческими проектами в Node.js (илидругие языки, но по той же схеме), чтобы показать мне, как это делается там, потому что, когда я читаю некоторые посты в блоге, у меня все еще остается ощущение, что они не созданы для большой масштабируемости, и они больше запускаютсяd чем бегуны на длинные дистанции (если вы понимаете, о чем я)-думать, и я должен использовать то, что я хочу, если я продолжаю следовать основным правилам шаблона Router-Controller-Service?