Замените шаблон промежуточного программного обеспечения на Observable (подписки отменяются?) - PullRequest
0 голосов
/ 21 января 2019

Существует общий подход к использованию промежуточного программного обеспечения во многих средах.

In ExpressJS - здесь я обрабатываю запрос с middleware-chain:

app.use('/url', middleware1);
app.use('/url', middleware2);
app.use('/url', middleware3);

In Telegraf - здесь я обрабатываю событие сообщения (как бот) с помощью middleware-chain:

bot.on('text', middleware1);
bot.on('text', middleware2);
bot.on('text', middleware3);

Выше приведены примеры работы, которые я хочу реализовать, чтобы отложить некоторые запросы / события. В этом случае, если мой middleware-chain в данный момент занят обработкой какого-либо запроса / события - я могу сохранить новые входящие события / запросы в БД и обработать их позже, когда мой middleware-chain будет свободен. Основной причиной этого является ограничение для некоторых пользователей отправлять только один запрос / событие за раз и ждать ответа, если middleware-chain занят.

Давайте предположим, что я могу хранить / извлекать все, что мне нужно, в / из БД. Однако, если я получил какой-либо запрос / событие из БД - я хочу отправить / передать этот запрос / событие через все мои промежуточные программы. В этом случае мне нужно переопределить всплывающее событие, если фреймворк не поддерживает это.

Однако я могу использовать Observable для этого.

ExpressJS:

const sbj = new Subject();

app.use('/url', (...args) => {
  sbj.next(args)
});

observable.subscribe({
  next: middleware1
});
observable.subscribe({
  next: middleware2
});
observable.subscribe({
  next: middleware3
});

Telegraf:

const sbj = new Subject();

bot.on('text', (...args) => {
  sbj.next(args)
});

observable.subscribe({
  next: middleware1
});
observable.subscribe({
  next: middleware2
});
observable.subscribe({
  next: middleware3
});

Но мне не хватает одной важной функции в Observable-chain, которую я имею в middleware-chain => в middleware-chain Я могу отменить следующее промежуточное ПО. Например. middleware1 -> next -> middleware2 -> cancel.

Как я могу добиться того же поведения с Observable (чтобы одна подписка могла отменить другую)? Я думаю, что для этого должно быть элегантное решение.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Без заметного экспресса предоставьте следующий («маршрут») для вас, чтобы пропустить цепочку промежуточного программного обеспечения https://expressjs.com/en/guide/using-middleware.html

var app = express()
var router = express.Router()

// predicate the router with a check and bail out when needed
router.use(function (req, res, next) {
  if (!req.headers['x-auth']) return next('router')
  next()
})

router.get('/', function (req, res) {
  res.send('hello, user!')
})

// use the router and 401 anything falling through
app.use('/admin', router, function (req, res) {
  res.sendStatus(401)
})
0 голосов
/ 21 января 2019

RxJS имеет свой собственный механизм "цепочки", называемый конвейерными операторами . Существует целый ряд доступных вам , как вы можете видеть здесь . Если у вас есть промежуточное программное обеспечение многократного использования, вы можете очень хорошо реализовать его как своих собственных операторов. Например, оператор аутентификации может выглядеть так:

function authenticator() = (obs$) => obs$.pipe(
  mergeMap(([req, res]) => req.isAuthenticated() ? of([req, res]) : throwError([res, "Must be authenticated!"]))
)

Затем вы можете использовать его следующим образом:

const sbj = new Subject();

app.use('/url', (...args) => {
  sbj.next(args)
});

sbj.pipe(
   authenticator(),
   // more operators
).subscribe(([req, res]) => {
   // send response
}, ([res, err]) => {
   // send error
})
...