Javascript Axios GET请求返回空对象
“dataService”类中的“getData”函数执行对API的GET请求,“updateData”函数中的console.log确实打印了正确的信息,但返回了一个空对象http://localhost:xxxx/api/data'. 我认为这是由于异步的问题,但我不知道如何解决它。有什么想法吗 dataService.ts:Javascript Axios GET请求返回空对象,javascript,node.js,typescript,express,axios,Javascript,Node.js,Typescript,Express,Axios,“dataService”类中的“getData”函数执行对API的GET请求,“updateData”函数中的console.log确实打印了正确的信息,但返回了一个空对象http://localhost:xxxx/api/data'. 我认为这是由于异步的问题,但我不知道如何解决它。有什么想法吗 dataService.ts: import { Format } from '../types'; import axios from 'axios'; const token = proc
import { Format } from '../types';
import axios from 'axios';
const token = process.env.TOKEN;
const url = `https://www.something.com/somequery?someapikey=${token}`;
const getData = async () => {
try {
const response = await axios.get<Format>(url);
return response.data;
} catch (error) {
console.error(error);
}
};
const updateData = async (): Promise<Format | undefined> => {
const allData = await getData();
console.log(allData, 'allData in backend');
//edit allData to suitable format here
return allData;
};
export default {
updateData
};
index.ts:
import express from 'express';
const app = express();
...
import dataRouter from './routes/data';
...
app.use(express.json());
...
app.use('/api/data', dataRouter);
...
修复
getData
以返回承诺,成功时解决一个问题,失败时拒绝一个问题
当您使用异步函数时,它将返回承诺,特别是当您想等待它时
const getData = async () => {
try {
const response = await axios.get<Format>(url);
return Promise.resolve(response.data);
} catch (error) {
console.error(error);
return Promise.reject()
}
};`
Response.send
应该从updateData()
接收解析值,而不是从中接收返回值,因为异步函数的返回值是承诺对象,添加缺少的等待将解决问题:
res.send(await dataService.updateData());
尝试在getData functionLogging response中记录响应对象。“getData”中的logging response.data与在“updateData”中记录所有数据打印相同的输出。顺序为:response.data优先,allData第二。谢谢你的留言!这似乎不起作用。它给了我同样的结果。@kcin当console.log(response.data)看到数据时?是的。“const response=wait axios.get(url);”之后的“getData”中的Logging response.data与“updateData”中的Logging allData打印相同的输出。顺序是:response.data优先,allData其次。好的,我现在理解这个问题了。更新了answerI-did-dataService.updateData().then(data=>{res.send(data)}),这就成功了。非常感谢。谢谢你的留言!出于某种原因,我不喜欢你的答案,但我会试试看。
const updateData = async (): Promise<Format | undefined> => {
const allData = await getData();
console.log(allData, 'allData in backend');
//edit allData to suitable format here
return Promise.resolve(allData);
};
import express from 'express';
import dataService from '../services/dataService';
const router = express.Router();
router.get('/', (_req, res) => {
dataService.updateData()
.then(data=>{
res.send(data)
})
.catch(error=>{})
});
export default router;
res.send(await dataService.updateData());