Неявная передача контекста клиента сервисам в Node - PullRequest
0 голосов
/ 27 января 2020

В node.js Я пытался найти способ передачи клиентского контекста из маршрутов Express в службы, чтобы каждая функция не имела context. Под контекстом я подразумеваю объект с типом пользователя, идентификатором, возможными запросами, переданными по запросу, и т. Д. c.

Я вижу три возможных способа сделать это, сохранить контекст как аргумент сервисов (уже более или менее так, как это делается), рефакторинг всех сервисов только получить точные данные, которые им нужны (много работы и нужно учитывать, что другие службы могут вызываться, передавая контекст) или что я пытаюсь сделать, неявно передает объект контекста между службами с Базовый класс службы, такой как:

class Service {
  call(service, context = null) {
    service._context = context || this._context;
    return service;
  }

  callWith(context) {
    this._context = context || this._context;
    return this;
  }
}

class FooService extends Service {
  constructor(model) {
    this.model = model;
  }

  async foo(bar) {
    // Calls other service and passes the context object to it
    bar.test = await this.call(barService).test(bar);
    return await this.model.foo(bar);
  }
}

// Somewhere else, defining my Express routes:
app.route(`foo/`).get(async (req, res, next) => {
  try {
    const limit = parseInt(req.query.limit, 10);
    const data = await fooService.callWith(req.context)
      .foo({ prop: req.query.property, limit: !isNaN(limit) ? limit : null });
    res.send(data);
  } catch (err) {
    next(err);
  }
});

Если есть лучший способ сделать это, было бы здорово узнать. Также меня беспокоит то, что, поскольку сервисы являются единичными экземплярами, они могут каким-то образом выполнять асинхронный код, используя неправильный контекст. Я знаю, что узел является однопоточным, но свойство context не asyn c, в то время как методы и контекст могут изменяться, в то же время разрешая обещание для другой службы.

Любые идеи приветствуются, спасибо.

...