从 Axios API 返回数据

IT技术 javascript node.js rest axios
2021-03-18 12:30:00

我正在尝试使用 Node.JS 应用程序来发出和接收 API 请求。它使用 Axios 向另一台服务器发出 get 请求,并使用从它接收的 API 调用中接收到的数据。第二个片段是脚本从调用中返回数据的时间。它实际上会获取它并写入控制台,但不会在第二个 API 中将其发送回。

function axiosTest() {
    axios.get(url)
        .then(function (response) {
            console.log(response.data);
            // I need this data here ^^
            return response.data;
        })
        .catch(function (error) {
            console.log(error);
        });
}

...

axiosTestResult = axiosTest(); 
response.json({message: "Request received!", data: axiosTestResult});

我知道这是错误的,我只是想找到一种方法让它发挥作用。我似乎可以从中获取数据的唯一方法是通过 console.log,这对我的情况没有帮助。

6个回答

问题是原始axiosTest()函数没有返回Promise。为了清楚起见,这里有一个扩展解释:

function axiosTest() {
    // create a promise for the axios request
    const promise = axios.get(url)

    // using .then, create a new promise which extracts the data
    const dataPromise = promise.then((response) => response.data)

    // return it
    return dataPromise
}

// now we can use that data from the outside!
axiosTest()
    .then(data => {
        response.json({ message: 'Request received!', data })
    })
    .catch(err => console.log(err))

该函数可以写得更简洁:

function axiosTest() {
    return axios.get(url).then(response => response.data)
}

或者使用异步/等待:

async function axiosTest() {
    const response = await axios.get(url)
    return response.data
}
你是真正的 MVP @kingdaro 我多年来一直被我的代码困住,然后我找到了你的答案,多么传奇
2021-04-25 12:30:00
它对我有用,只是在 axios.post() 之前使用 await
2021-04-26 12:30:00
听起来您只是在问如何将代码拆分为单独的文件。研究在 JavaScript 中使用module
2021-04-28 12:30:00
对我来说也是一样,我想在不同的文件中使用 axiosTest() 函数,然后是调用函数。有人对此有想法吗?
2021-05-15 12:30:00
如果函数 axiosTest() 与调用函数位于不同的文件中,我似乎无法让它工作: axiosTest().then.... 在这种情况下有什么特别的事情要做吗?
2021-05-20 12:30:00

我知道这个帖子很旧。但是我已经看到一些人尝试使用 async 和 await 来回答,但都弄错了。这应该清除任何新的参考

async function axiosTest() {
      try {
        const {data:response} = await axios.get(url) //use data destructuring to get data from the promise object
        return response
      }

      catch (error) {
        console.log(error);
      }
    }
这是正确的答案 - 当您调试应用程序中的代码时,调用上述函数的函数将与链中的所有其他函数一样返回,但稍后代码将在等待后开始执行。您需要将应用程序中的所有函数设为异步,并使用 await 调用所有函数。在 return 语句上放置一个断点,在调用者的下一行代码上放置一个断点 - 一切都会变得清晰。
2021-04-25 12:30:00

你可以用一个简单的回调函数填充你想要的数据,假设我们有一个名为lst我们想要填充的列表,我们有一个 pupulates pupulates 列表的函数,

const lst = [];  
const populateData = (data) => {lst.push(data)} 

现在我们可以将回调函数传递给进行 axios 调用的函数,当我们从响应中获取数据时,我们可以生成列表。

现在我们创建我们的函数来发出请求并populateData作为回调函数传递

function axiosTest (populateData) {
        axios.get(url)
       .then(function(response){
               populateData(response.data);
        })
        .catch(function(error){
               console.log(error);
         });
}   
你讨厌看到它发生,伙计们。
2021-04-26 12:30:00
谢谢@Fahad_Shovon!这花了我一天的时间进行故障排除,我使用您的解决方案解决了这个问题
2021-05-20 12:30:00

axiosTest()正在射击asynchronously而不是等待。

then() function之后需要连接A以捕获response variable( axiosTestData)。

查看Promise更多信息。

Async升级。

// Dummy Url.
const url = 'https://jsonplaceholder.typicode.com/posts/1'

// Axios Test.
const axiosTest = axios.get

// Axios Test Data.
axiosTest(url).then(function(axiosTestResult) {
  console.log('response.JSON:', {
    message: 'Request received',
    data: axiosTestResult.data
  })
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.js"></script>

axios 库创建了一个 Promise() 对象。Promise 是 JavaScript ES6 中的内置对象。当这个对象使用 new 关键字实例化时,它接受一个函数作为参数。这个单个函数又接受两个参数,每个参数也是函数——resolve 和 reject。

Promise 执行客户端代码,并且由于很酷的Javascript 异步流程,最终可以解决一两件事,即解决方案(通常被认为在语义上等同于 Promise 的成功),或拒绝(广泛认为是错误的解决方案) )。例如,我们可以持有对某个 Promise 对象的引用,该对象包含一个最终会返回响应对象(将包含在 Promise 对象中)的函数。所以我们可以使用这样的Promise的一种方法是等待Promise解决某种响应

您可能会说我们不想等待几秒钟左右的时间让我们的 API 返回调用!我们希望我们的 UI 能够等待 API 响应的同时做一些事情否则,我们将拥有一个非常缓慢的用户界面。那么我们如何处理这个问题呢?

那么 Promise 是异步的在负责执行 Javascript 代码的引擎(例如 Node 或通用浏览器)的标准实现中,它将在另一个进程中解析,而我们事先不知道 Promise 的结果是什么。通常的策略是我们的函数(即类的 React setState 函数)发送到 promise,根据某种条件(取决于我们选择的库)来解析。这将导致我们的本地 Javascript 对象根据Promise解析进行更新。因此,您可以考虑发送给异步方法的函数,而不是 getter 和 setter(在传统的 OOP 中)

我将在此示例中使用 Fetch,以便您可以尝试了解 Promise 中发生的事情,并查看是否可以在 axios 代码中复制我的想法。Fetchaxios基本类似,没有先天的 JSON 转换,并且有不同的解析 promise 的流程(你应该参考 axios 文档来学习)。

获取缓存.js

const base_endpoint = BaseEndpoint + "cache/";
// Default function is going to take a selection, date, and a callback to execute.
// We're going to call the base endpoint and selection string passed to the original function.
// This will make our endpoint.
export default (selection, date, callback) => {  
  fetch(base_endpoint + selection + "/" + date) 
     // If the response is not within a 500 (according to Fetch docs) our promise object
     // will _eventually_ resolve to a response. 
    .then(res => {
      // Lets check the status of the response to make sure it's good.
      if (res.status >= 400 && res.status < 600) {
        throw new Error("Bad response");
      }
      // Let's also check the headers to make sure that the server "reckons" its serving 
      //up json
      if (!res.headers.get("content-type").includes("application/json")) {
        throw new TypeError("Response not JSON");
      }
      return res.json();
    })
    // Fulfilling these conditions lets return the data. But how do we get it out of the promise? 
    .then(data => {
      // Using the function we passed to our original function silly! Since we've error 
      // handled above, we're ready to pass the response data as a callback.
      callback(data);
    })
    // Fetch's promise will throw an error by default if the webserver returns a 500 
    // response (as notified by the response code in the HTTP header). 
    .catch(err => console.error(err));
};

现在我们已经编写了 GetCache 方法,让我们来看看更新 React 组件状态的示例……

一些 React Component.jsx

// Make sure you import GetCache from GetCache.js!

resolveData() {
    const { mySelection, date } = this.state; // We could also use props or pass to the function to acquire our selection and date.
    const setData = data => {
      this.setState({
        data: data,
        loading: false 
        // We could set loading to true and display a wee spinner 
        // while waiting for our response data, 
        // or rely on the local state of data being null.
      });
    };
  GetCache("mySelelection", date, setData);
  }

最终,你不会像这样“返回”数据,我的意思是你可以,但改变你的思维方式更惯用......现在我们数据发送到异步方法。

快乐编码!