Async / await не работают для приложения Node.js на heroku - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь запустить какое-то приложение Node.js на heroku, и я пытаюсь понять, почему не работает async / await.

Здесь я пытаюсь выполнить какой-то вызов на другом сервере Например, google.com и отобразить результат, однако console.log('x: ${x}') никогда не выполняется, процесс зависает, а внутреннее обещание никогда не разрешается (выглядит так) и никогда не возвращает управление процессу. Кроме того,

const express = require('express')
const path = require('path')
const PORT = process.env.PORT || 5000

express()
  .use(express.static(path.join(__dirname, 'public')))
  .get('/th', async (req, res) => {
    try {
        const x = await callX();

        console.log(`x: ${x}`)
        return x;
    } catch (err) {
        console.error(err);
        res.send("Error " + err);
    }
  }).listen(PORT, () => console.log(`Listening on ${ PORT }`))


callX = () => {


    const data = JSON.stringify({
        todo: 'Some data'
    })

    const options = {
        hostname: 'google.com',
        port: 443,
        path: '/',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': data.length
        }
    }



    return new Promise(function(resolve, reject) {
        const req = https.request(options, (res) => {
            console.log(`statusCode: ${res.statusCode}`)

            res.on('data', (d) => {
                console.log(`d: ${d}`)
                process.stdout.write(d);
                resolve(d);
            })
        })

        req.on('error', (error) => {

            console.error(error);
            reject(error);
        })

        req.write(data)
        req.end()

    })

}

Я что-то не так делаю или неправильно понимаю, как это должно работать?

1 Ответ

0 голосов
/ 07 февраля 2020

Небольшой рефакторинг и добавлен https import

const express = require('express');
const path = require('path');
const https = require('https');
const PORT = 3000;

const app = express();
app.use(express.static(path.join(__dirname, 'public')));
app.get('/th', async (req, res) => {
  try {
    console.log(`first1`);

    const x = await callX();

    console.log(`x: ${x}`);

    res.send(x);
  } catch (err) {
    console.error(err);
    res.send('Error ' + err);
  }
});

app.listen(PORT, () => console.log(`Listening on ${PORT}`));

callX = () => {
  console.log('sdfasdf');
  const data = JSON.stringify({
    todo: 'Some data'
  });

  const options = {
    hostname: 'google.com',
    port: 443,
    path: '/',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Content-Length': data.length
    }
  };

  return new Promise((resolve, reject) => {
    const req = https.request(options, (res) => {
      console.log(`statusCode: ${res.statusCode}`);

      res.on('data', (d) => {
        console.log(`d: ${d}`);
        process.stdout.write(d);
        resolve(d);
      });
    });

    req.on('error', (error) => {
      console.error(error);
      reject(error);
    });

    req.write(data);
    req.end();
  });
};

...