假设我有以下样板快递应用程序:
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
答案 0 :(得分:1)
您要将person.sayHello()
的结果传递给res.send
,但是,由于sayHello
是一个异步函数,因此您需要将then
或await
传递给{得到承诺的结果。这些函数也在您的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并返回响应数据的标题。但是,除了由于空路由导致的超时之外,我无法重现您正在描述的问题。