How to do Axios request from Firebase Cloud Function

谁说我不能喝 提交于 2020-12-29 03:42:26

问题


I've tried the following in Firebase Cloud Function to do an Axios request but it didn't work.

    const functions = require('firebase-functions');
    const axios = require('axios');
    const cors = require('cors')({ origin: true });

exports.checkIP = functions.https.onRequest((req, res) => {
    cors(req, res, () => {
        if( req.method !== "GET" ) {
            return res.status(401).json({
                message: "Not allowed"
            });
        }

        return axios.get('https://api.ipify.org?format=json')
        .then(data => {
            console.log(data)
            res.status(200).json({
                message: data.ip
            })
        })
        .catch(err => {
            res.status(500).json({
                error: err
            })
        })

    })
})

I've also googled a lot for seeing some example of how to use Axios with Cloud Functions but found none. The above code is not returning anything.

Can anyone help?

P.S.: I've already added billing details in my Firebase account and not using the free Spark plan, rather using Blaze plan.

Edit:

I've finally able to do this using the request-promise node package but still no idea about how to do it with axios. As no matter what I try, axios doesn't work in Firebase cloud functions. This is what I did:

npm i --save cors request request-promise

Then this is the code I run: https://gist.github.com/isaumya/0081a9318e4f7723e0123f4def744a0e

Maybe it will help someone. If anyone knows how to do it with Axios please answer below.


回答1:


I changed data.ip to response.data.ip and added return before the two res.status(... lines and the deployed cloud function works for me using Axios when I try it.

The code I have is

const functions = require('firebase-functions');
const axios = require('axios');
const cors = require('cors')({ origin: true });

exports.checkIP = functions.https.onRequest((req, res) => {
  cors(req, res, () => {
    if (req.method !== "GET") {
      return res.status(401).json({
        message: "Not allowed"
      });
    }

    return axios.get('https://api.ipify.org?format=json')
      .then(response => {
        console.log(response.data);
        return res.status(200).json({
          message: response.data.ip
        })
      })
      .catch(err => {
        return res.status(500).json({
          error: err
        })
      })

  })
});

When I invoke the function I get back a reply like { "message": "127.168.121.130" }




回答2:


I experienced the same issue. An HTTP request with axios returns the following error message : TypeError: Converting circular structure to JSON

Here is an explanation of what is going on and how to get around this

You can use the following package : https://github.com/moll/json-stringify-safe

I'm not sure about the consistency of this approach and personally went for request-promise, which is heavier than axios but allows straightforward HTTP requests.



来源:https://stackoverflow.com/questions/51952295/how-to-do-axios-request-from-firebase-cloud-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!