我有一个使用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');
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');
答案 0 :(得分:1)
问题是getTweetData()
实际上返回了一个承诺,这就是tData
出现为承诺未决的原因。异步函数将返回Promise,您可以在MDN
不再使用异步,我们可以在下面
app.get('/api/twitter/data', (req, res) => {
const tData = getTweetData().then((data)=>{
return data;
});
console.log("tData: ", tData);
res.json({tData});
})
并更改它以处理在promise解析时将获得的响应数据。
app.get('/api/twitter/data', (req, res) => {
getTweetData().then((data)=>{
//we have the data so just send the res here
res.json({data});
});
})
另一种方法是更改用于Express API端点的匿名函数以使用异步。注意:我不确定Express是否支持这一点,我只是在演示如何使用异步函数
来编写它 app.get('/api/twitter/data', async (req, res) => {
const tData = await getTweetData()
console.log("tData: ", tData);
res.json({tData});
})