Шаблон Node.js Router-Controller-Service - создание нескольких ошибок из служб (бизнес-логика) - PullRequest
0 голосов
/ 05 октября 2019

Я разрабатываю 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?

...