Ожидать асинхронного возврата модуля кукловода, прежде чем продолжить экспресс - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть сервер expressjs, настроенный с фоновым скриптом, работающим кукловодом.Сценарий кукловода выполняется, а затем возвращает объект JSON с 4 свойствами.Это должно затем быть сохранено в переменных результатов (глобальная область) в server.js

. Проблема в том, что мой скрипт кукловода (вызываемый с помощью оператора module / require) не ожидает, несмотря на то, что я явноговорю это сделать.Когда я отлаживаю, программа не ждет завершения моего модуля кукловода, а просто выполняет эту функцию (app.listen).Возврат JSON должен быть доступен через мой API, но вместо этого результаты не определены.

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

КОД

В express.js


app.get('/api', (req, res) => {
  try {
    res.json(results);
    console.log('JSON SENT'.black)
  } catch(e) {
    console.error(e);
    res.send("SCRIPT NOT FINISHED OR FAILED");
  }
});

app.listen(port, async() => {
  results = await puppet.puppet('verbose');
  console.log(results);
})

В puppet.js

if(testPagesLive()) {
        let quoteMadeAndRetrieved;
        [optileadCredits, quoteMadeAndRetrieved] = await Promise.all([optiCheck(), runQuote()]);
        [quoteMade, quoteRetrieved] = quoteMadeAndRetrieved;
      }

return {
        sitesUp: sitesUp,
        optileadCredits: optileadCredits,
        quoteMade: quoteMade,
        quoteRetrieved: quoteRetrieved
      }

1 Ответ

0 голосов
/ 06 февраля 2019

Второй аргумент app.listen - это функция обратного вызова, означающая, что только после того, как приложение уже прослушивает данный порт, оно будет пытаться выполнить эту функцию.То, что вы делаете там с results = await puppet.puppet('verbose');, задерживает запись данных в переменную, но не задерживает прослушивание порта.Если вы хотите исправить это, вы можете сделать так, чтобы приложение прослушивало порт после завершения функции

(async ()=> {
    results = await puppet.puppet('verbose');
    app.listen(port, () => {
        console.log(results);
    })
})()

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

app.get('/api', (req, res) => {
    results.then(data => {
        res.json(data);
        console.log('JSON SENT'.black);
    });
});

app.listen(port, () => {
    results = puppet.puppet('verbose');
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...