Должен ли я сохранять данные в БД асинхронно - PullRequest
1 голос
/ 20 июня 2019

Я использую ноды экспресс и постресс.Я не уверен, является ли то, что я пытаюсь сделать, хорошей практикой или очень большой ошибкой.Сохраните данные в базе данных асинхронно после того, как я уже верну результат клиенту.

Я попытался продемонстрировать это с console.log, чтобы проверить, будет ли мой сервер заблокирован во время сохранения.

Здесь выможет видеть status маршрут и statusB маршрут.

  app.get("/statusB", async (req, res) => {
    return res.status(200).send("testAAA");
  });

  app.get("/status", async (req, res) => {
    const userStats = await UserController.getData("id")
    const x = test();

    return res.status(200).send(userStats);
  });

  async function test() {
    return new Promise(() => { 
      for (let x = 0; x < 10000; x++) {

        setTimeout( () => {
          console.log(x)
        }, 5000);
      }
    })
  }

Что я должен хотеть, это случиться, если я отправлю /status и сразу после отправки statusB.

Я ожидаювыходные данные будут:
/status вернет данные userStats
/StatusB вернет 'testAAA'
, и счетчик будет работать асинхронно.


Но фактический результат:
- /status возврат данных userStats
- запуск счетчика
- /StatusB возврат 'testAAA' только после завершения счетчика

Журнал консоли толькопроверьте, могу ли я извлекать и сохранять данные в базу данных асинхронно вместо журнала консоли.

Ответы [ 3 ]

1 голос
/ 20 июня 2019

Зависит от вашего бизнес-кейса.

Если ваш клиент может получить код состояния 200 OK, даже если сбой действительно может быть неудачным, то, конечно, вы можете сделать это асинхронно после ответа.

В других случаях вы захотите сохранить данные в запросе и отвечать только после того, как убедитесь, что все в порядке.

0 голосов
/ 20 июня 2019

Да, вы должны сохранять данные в БД асинхронно, из-за того, как работает nodejs.Если вы ждете ответа от db (синхронно), nodejs блокирует цикл обработки событий и не обрабатывает новые запросы от клиентов.НО, если ваша бизнес-логика основана на том факте, что вы должны возвращать ответ от db клиенту, вы должны делать это синхронно и, возможно, подумать об обходных путях или выбрать другое время выполнения, если это станет проблемой.

0 голосов
/ 20 июня 2019

Это зависит от вашей логики, если вы хотите, например, вернуть сохраненный ресурс клиенту, вам следует подождать (async/await или callback), пока данные не будут сохранены в базе данных, но, например, если вы хотите просто войти действие без каких-либо возвратов во внешний интерфейс, вы можете сохранить его асинхронно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...