从导入的类内部要求模块

时间:2018-11-09 15:15:31

标签: javascript node.js express ecmascript-6

假设我有以下样板快递应用程序:

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 :(得分:1)

您要将person.sayHello()的结果传递给res.send,但是,由于sayHello是一个异步函数,因此您需要将thenawait传递给{得到承诺的结果。这些函数也在您的Person构造函数中调用,而不执行Promise。我认为这是多余的,因为您是在初始化一个人之后在您的Express应用中调用该函数的。

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;
  }
}

不确定是否从问题中删除了Express应用程序中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函数内部要求axios并返回响应数据的标题。但是,除了由于空路由导致的超时之外,我无法重现您正在描述的问题。