Express не обслуживает второй API при обработке первого API - PullRequest
0 голосов
/ 09 января 2019

Я тестирую свой сервер API. Я хочу знать, почему Express не обслуживает второй запрос API при обработке первого запроса API.

Я создал тестовые маршруты. Мой первый маршрут /sleep обработка запроса с таймером 10 секунд.

Второй маршрут /test - это просто ответ с сообщением.

app.get('/sleep', function (req, res) {
   let newTime = (new Date()).getTime() + 10 * 1000;
   let x = 1;
   while (x) {
      let currTime = (new Date()).getTime();
      x = newTime < currTime ? 0 : 1;
   }
   return res.send("One minute complete");
});

app.get('/test', function (req, res) {
   return res.send("One minute test");
});

Я прошел по маршруту /sleep из браузера и в новой вкладке нажал /test. второй маршрут отвечает после первого маршрута соревнования.

Так почему это происходит? Я что-то не так делаю?

Ответы [ 2 ]

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

Причина этого в том, что Node является однопоточным, и ваш синхронный код (который приведен ниже) создает для него блокиратор.

let newTime = (new Date()).getTime() + 10 * 1000;
  let x = 1;
  while (x) {
    let currTime = (new Date()).getTime();
    x = newTime < currTime ? 0 : 1;
  }

Решение: Сделать его асинхронным, чтобы оно было отправлено в цикл обработки событий.

Пример: Вместо использования этой синхронной логики используйте setTimeout

setTimeout(function() { res.send('done'); }, 10000)

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

Nodejs является "однопоточным". Вы не должны блокировать поток.

Если вы хотите отложить ответ, просто используйте setTimeout

app.get('/sleep', function (req, res) {
   setTimeout(function() { res.send('10 seconds complete'); }, 10*1000)
});

app.get('/test', function (req, res) {
   return res.send("One minute test");
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...