【问题标题】:Axios GET request returning empty objectAxios GET 请求返回空对象
【发布时间】:2021-02-03 18:26:18
【问题描述】:

“dataService”类中的“getData”函数对 API 执行 GET 请求,“updateData”函数中的 console.log 会打印正确的信息,但会为“http://localhost”返回一个空对象:xxxx/api/数据'。我认为这是由于异步问题造成的,但我不知道如何解决它。有什么想法吗?

dataService.ts:

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
};

数据.ts:

import express from 'express';
import dataService from '../services/dataService';

const router = express.Router();

router.get('/', (_req, res) => {
  res.send(dataService.updateData());
});

export default router;

index.ts:

import express from 'express';
const app = express();

...

import dataRouter from './routes/data';

...

app.use(express.json());

...

app.use('/api/data', dataRouter);

...

【问题讨论】:

  • 尝试在getData函数中记录响应对象
  • 在“getData”中记录 response.data 打印与在“updateData”中记录 allData 相同的输出。按顺序:response.data 第一,allData 第二。

标签: javascript node.js typescript express axios


【解决方案1】:

修复getData返回Promise,成功时解析一个,不成功时拒绝一个。

当你有异步函数时,它应该返回承诺,尤其是当你想await它时。

const getData = async () => {
 try {
    const response = await axios.get<Format>(url);
    return Promise.resolve(response.data);
 } catch (error) {
    console.error(error);
    return Promise.reject()
   }
};`

更新数据也应重新提交承诺

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);
};

您还需要等待 updateData :

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;

【讨论】:

  • 感谢您的留言!这似乎不起作用。它给了我同样的结果。
  • @kcin 当你看到console.log(response.data) 数据时?
  • 是的。在“const response = await axios.get(url);”之后在 'getData' 中记录 response.data打印与在“updateData”中记录 allData 相同的输出。按顺序:response.data 第一,allData 第二。
  • 好的,我现在明白这个问题了。更新了答案
  • 我做了 dataService.updateData() .then(data=>{ res.send(data) }) 并且有效。谢谢!
【解决方案2】:

Response.send 应该从updateData() 接收解析值,而不是从它返回的值,因为异步函数的返回值是一个 promise 对象,添加缺少的 await 将解决问题:

res.send(await dataService.updateData());

【讨论】:

  • 感谢您的留言!出于某种原因,我不喜欢你的回答,但我会试试看。
猜你喜欢
  • 2021-09-11
  • 1970-01-01
  • 2022-01-01
  • 2019-05-31
  • 2018-07-07
  • 2021-08-08
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
相关资源
最近更新 更多