Обрабатывать несколько POST-запросов с отправителями / слушателями - PullRequest
0 голосов
/ 19 мая 2018

Код:

app.post('/new', urlencodedParser, function (req, res) {
  if (!req.body) return res.sendStatus(400);

  emitter.on('response', function (output) {
    res.status(200).json({ip: `${output}`, id: `${random_id}`});
  });
});

Проблема:

Проблема, с которой я столкнулся сейчас (я использую express) я не могу сделать несколько запросов к приложению.Express возвращает ожидаемое значение в первый раз и каждый раз после этого:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

Остальная часть приложения представляет собой набор функций, запускаемых источниками событий и прослушивателями.Думайте об этом как о цепочке излучателей, запускающих слушателей и выполняющих 4 или 5 функций подряд, и, в конце, возвращающих значение.

Это работает безупречно в первый раз, но никогда больше.Обратите внимание, что запросы должны поступать с разных машин, а не с одной машины.

Я знаю, res.end() завершит ответ, но никакая комбинация функций Express не заставит его работать во второй раз.Есть ли способ использовать излучатели / слушатели и Экспресс-ответы?

Заранее спасибо!

РЕДАКТИРОВАТЬ: больше кода

emitter.on('newRequest', persistentDisk);
emitter.on('newDisk', persistentDisk);
emitter.on('newDeployment', newDeployment);
emitter.on('newService', createService);
emitter.on('checkDeployment', checkDeployment);
emitter.on('returnIp', returnIp);

emitter.on('deleteRequest', deleteApp);

app.post('/new', urlencodedParser, function (req, res) {
  if (!req.body) return res.sendStatus(400);

  var random_id = randomize('a', 8);

  var user_id = req.body.user_id;
  var stripe_id = req.body.stripe_id;
  var app_name = req.body.app_name;
  var gpu_count = req.body.gpu_count;
  var cpu_count = req.body.cpu_count;
  var memory_count = req.body.memory_count;

  emitter.emit('newRequest', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count);
  emitter.on('response', function (output) {
    res.send({ip: `${output}`, id: `${random_id}`});
  });
    async function persistentDisk(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
      try {
            emitter.emit('newDeployment', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count);
            emitter.emit('newService', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count);
      } catch (err) {
        console.log(err);
        errors.report(err);
      }
    }

async function newDeployment(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
  try {
    var deployConfig = JSON.parse(`...`);

      emitter.emit('checkDeployment', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count);

  } catch (err) {
    console.log(err);
    errors.report(err);
  }
}

async function createService(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
  try {
    var exposeConfig = JSON.parse(`...`);

      emitter.emit('returnIp', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count)
  } catch (err) {
    console.log(err);
    errors.report(err);
  }
}

async function checkDeployment(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
  try {
  } catch (err) {
    console.log(err);
    errors.report(err);
  }
}

async function returnIp(random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count) {
  try {
    var service = JSON.parse(`{"ip":"127.0.0.1"}`)
    jq.run('.ip', service, { input: 'json' }).then((output) => {
      emitter.emit('response', output)
      if (output.toString() === "null") {
        setInterval(() => {
          console.log('value is null');
          emitter.emit('returnIp', random_id, user_id, stripe_id, app_name, gpu_count, cpu_count, memory_count)
        }, 15000);
        }
      });
  } catch (err) {
    console.log(err);
    errors.report(err);
  }
}

Это дает ответ (127.0.0.1, что важно) в первый раз.

1 Ответ

0 голосов
/ 19 мая 2018

Изменение на:

app.post('/new', urlencodedParser, function (req, res) {
  if (!req.body) return res.sendStatus(400);

  emitter.once('response', function (output) {
    res.status(200).json({ip: `${output}`, id: `${random_id}`});
  });
});

(от emitter.on до emitter.once) решает проблему.

...