Javascript 需要来自导入类内部的模块

Javascript 需要来自导入类内部的模块,javascript,node.js,express,ecmascript-6,Javascript,Node.js,Express,Ecmascript 6,假设我有以下样板快速应用程序: const express=require('express'); 常量app=express(); const Person=require('./controllers/Person.js'); 应用程序获取(“/”,(请求,请求)=>{ }) 应用程序发布(“/”,(请求,回复)=>{ var person=新人(“鲍勃”、“史密斯”); res.send(person.sayHello()); }); 应用程序侦听(端口,()=>{ log('示例应用程序

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

const express=require('express');
常量app=express();
const Person=require('./controllers/Person.js');
应用程序获取(“/”,(请求,请求)=>{
})
应用程序发布(“/”,(请求,回复)=>{
var person=新人(“鲍勃”、“史密斯”);
res.send(person.sayHello());
});
应用程序侦听(端口,()=>{
log('示例应用程序在端口'+3000'上侦听);
})
我的person.js文件如下所示:

module.exports=班级人员{
构造函数(第一个,最后一个){
this.first=first;
this.last=last;
这个;
}
你好{
return('嗨,我的名字是'+this.first+''+this.last)
}
}
现在这一切都很好,但当我想导入只在person类上工作的模块时,情况就不一样了

例如,如果我将
Person.sayHello()
更改为:

async sayHello(){
var axios=require('axios')
var response=wait axios.get('https://jsonplaceholder.typicode.com/todos/1')
返回响应.title
} 
整个项目拒绝服务请求。我已经解决了问题,问题是我需要新模块的线路,但我不能想出另一种方法,仅为该类需要该模块

此外,如果我将
sayHello()
函数更改为:

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

服务器仍然出错,GET请求给我一个
ERR\u连接被拒绝

您正在将
person.sayHello()
的结果传递给
res.send
,但是,由于
sayHello
是一个异步函数,您需要
然后
等待
以获得承诺的结果。函数也在
Person
构造函数中调用,而不执行承诺。我认为这是冗余的,因为您在启动一个人后调用了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并返回响应数据的标题。但是,我无法重现您所描述的问题,但空路由导致的超时除外。

Hmm,我的异步有点缺少atm,但可能:
var person=new person('Bob','Smith');var title=wait person.sayHello();发送文件(标题)
您立即发送sayHello的响应,而无需等待axios请求解决。您正在将
person.sayHello()
的结果传递给
res.send
,但是,由于
sayHello
是一个异步函数,因此需要
然后
等待
才能获得结果。您的意思是什么“拒绝服务请求”?是否出现错误?超时?具体是什么?尝试在express app之外加载person类,例如制作一个简单的测试文件,加载person类并打招呼(只需使用node运行它),你得到了什么?@NikosM.a POST to/returns 503。我应该说得更具体一些,我也尝试过这个,但我的问题是,当我调用这个函数时,整个express服务器关闭,并给我一个
错误连接\u拒绝
,异步部分与这个特定问题无关,它是需要节点dyna的线路导致错误的函数内部。是否要求在函数内部需要模块?当不需要模块时,模块是否工作。我把它放在问题中,因为它似乎是最有可能去的地方,但是当我将其包含在子类中的任何位置时,它失败了。如果您取消clare和require axios在类外,在
模块上方的文件顶部。导出
?则来自我的服务器的响应为空。