Требование модулей из импортированных классов - PullRequest
0 голосов
/ 09 ноября 2018

Допустим, у меня есть следующее шаблонное экспресс-приложение:

const express = require('express');
const app = express();
const Person = require('./controllers/person.js');


app.get('/', (req, res) => {
})

app.post('/', (req, res) => {
    var person = new Person('Bob', 'Smith');
    res.send(person.sayHello());
});

app.listen(port, () => {
    console.log('Example app listening on port ' + 3000);
})

И мой файл person.js выглядит так:

module.exports = class Person {

   constructor(first, last) {
       this.first = first;
       this.last = last;
       this.sayHello();
   }


   sayHello() {
       return ('Hi, my name is ' + this.first + ' ' + this.last)
   }

}

Теперь все это работает нормально, но все перестает работать, когда я хочу импортировать модули, которые будут работать только с классом person.

Например, когда я изменяю Person.sayHello() на:

async sayHello() {
       var axios = require('axios')
       var response = await axios.get('https://jsonplaceholder.typicode.com/todos/1')
       return response.title
   } 

Весь проект отказывается обслуживать запросы. Я обнаружил, что проблема в том, что мне нужен новый модуль, но я не могу найти другой способ потребовать этот модуль только для этого класса?

Кроме того, асинхронность здесь не проблема, если я изменю функцию sayHello() на:

sayHello() {
       var axios = require('axios')
       return 'This line is never returned';
}

Сервер все еще выдает ошибки, и запрос GET дает мне ERR_CONNECTION_REFUSED

1 Ответ

0 голосов
/ 09 ноября 2018

Вы передаете результат person.sayHello() в res.send, однако, поскольку sayHello является асинхронной функцией, вам нужно then или await, чтобы получить результат Обещания. Функции также вызываются в вашем конструкторе Person без выполнения Promise. Я предполагаю, что это избыточно, так как вы вызываете функцию в своем экспресс-приложении после инициации человека.

app.post('/', async (req, res) => {
  const person = new Person('Bob', 'Smith');

  try {
    res.send(await person.sayHello());
  } catch(error) {
    res.send(error.message || `${error}`);
  }
});

Вы также обнаружите, что ответ от axios не имеет свойства title, вам нужно получить к нему доступ response.data.title.

module.exports = class Person {
  constructor(first, last) {
    this.first = first;
    this.last = last;
  }

  async sayHello() {
    const axios = require('axios');
    const response = await axios.get(
      'https://jsonplaceholder.typicode.com/todos/1'
    );

    return response.data.title;
  }
}

Не уверен, удалили ли вы реализацию вашего запроса get в экспресс-приложении из вопроса или у вас его еще нет. Если это так, то для GET-запроса время ожидания истечет до /.

const express = require('express');
const app = express();
const Person = require('./controllers/person.js');

app.get('/', (req, res) => {
  res.send('Hello, World!');
})

app.post('/', async (req, res) => {
  const person = new Person('Bob', 'Smith');
  res.send(await person.sayHello());
});

app.listen(3000, () => {
  console.log('Example app listening on port ' + 3000);
})

В любом случае, используя два предыдущих блока кода, мне удалось добиться того, чтобы в функции sayHello требовались аксиомы, и вернуть заголовок данных ответа. Однако я не могу воспроизвести описанную вами проблему, за исключением тайм-аута из-за пустого маршрута.

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