Reactjs 如何在express get调用中解决异步函数中挂起的承诺
我使用express.get()创建了一个api调用,其中还调用了一个异步函数来返回axios.get()请求。getTwitterData()异步函数仅返回promise pending。我如何解决这个问题Reactjs 如何在express get调用中解决异步函数中挂起的承诺,reactjs,express,axios,Reactjs,Express,Axios,我使用express.get()创建了一个api调用,其中还调用了一个异步函数来返回axios.get()请求。getTwitterData()异步函数仅返回promise pending。我如何解决这个问题 'use strict'; const axios = require('axios'); const express = require('express'); const app = express(); const jwt = require('express-jwt');
'use strict';
const axios = require('axios');
const express = require('express');
const app = express();
const jwt = require('express-jwt');
const jwks = require('jwks-rsa');
const cors = require('cors');
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());
const auth = `OAuth oauth_consumer_key="D1X5bwx6tF5rNcC9J6iPDfhqP",oauth_token="4686534691-KcECHY2gBOtIqSAKrCYVFDKpOgkb1yNw5e3CCwk",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1521437993",oauth_nonce="peQkEX9wZZM",oauth_version="1.0",oauth_signature="U%2FG%2BLtMLOWQPUO3tHmwZk0iBrgY%3D"`;
const url = `https://api.twitter.com/1.1/users/search.json?q=singer`;
app.get('/api/twitter/data', (req, res) => {
const tData = getTweetData().then((data)=>{
return data;
});
console.log("tData: ", tData);
res.json({tData});
})
async function getTweetData() {
try{
const data = await axios.get(url, { headers: { Authorization: auth } });
return data;
}catch(err){
console.log(err);
}
}
app.listen(3333);
console.log('Listening on localhost:3333');
问题是
getTweetData()
实际上返回了一个承诺,这就是为什么tData
显示为承诺待定。异步函数将返回一个承诺,您可以在
如果不再使用异步,我们可以采取以下措施
app.get('/api/twitter/data', (req, res) => {
const tData = getTweetData().then((data)=>{
return data;
});
console.log("tData: ", tData);
res.json({tData});
})
并将其更改为处理承诺解析时将获得的响应数据
app.get('/api/twitter/data', (req, res) => {
getTweetData().then((data)=>{
//we have the data so just send the res here
res.json({data});
});
})
另一种选择是将用于expressapi端点的匿名函数更改为使用async。注意:我不确定Express是否支持此功能,我只是演示如何使用异步函数编写此功能
app.get('/api/twitter/data', async (req, res) => {
const tData = await getTweetData()
console.log("tData: ", tData);
res.json({tData});
})
问题是
getTweetData()
实际上返回了一个承诺,这就是为什么tData
显示为承诺待定。异步函数将返回一个承诺,您可以在
如果不再使用异步,我们可以采取以下措施
app.get('/api/twitter/data', (req, res) => {
const tData = getTweetData().then((data)=>{
return data;
});
console.log("tData: ", tData);
res.json({tData});
})
并将其更改为处理承诺解析时将获得的响应数据
app.get('/api/twitter/data', (req, res) => {
getTweetData().then((data)=>{
//we have the data so just send the res here
res.json({data});
});
})
另一种选择是将用于expressapi端点的匿名函数更改为使用async。注意:我不确定Express是否支持此功能,我只是演示如何使用异步函数编写此功能
app.get('/api/twitter/data', async (req, res) => {
const tData = await getTweetData()
console.log("tData: ", tData);
res.json({tData});
})
异步的第二个app.get确实可以工作,但是当我调用res.json({tData})时,我得到了“unhandledPromisejectionWarning:unhandledPromisejectionRejection(RejectionID:1):TypeError:Converting circular structure to json”这样的数据已经是json格式的,所以我还调用了其他东西吗?所以我需要以tData.data的形式访问数据。我不知道这是一个返回了密钥的对象。@AustinBorn如果这有效,请将答案标记为正确。感谢第二个app.get和异步确实起作用,但是当我调用res.json({tData})时,我得到了这个“未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:1):TypeError:将循环结构转换为json”数据已经是json格式,所以我调用了其他东西吗?所以我需要以tData.data的形式访问数据。我不知道这是一个返回了密钥的对象。@AustinBorn如果这有效,请将答案标记为正确。谢谢