【问题标题】:How to correctly execute a axios POST request within a firebase cloud function如何在 Firebase 云功能中正确执行 axios POST 请求
【发布时间】:2019-02-20 12:53:21
【问题描述】:

我目前正在开发一个应用程序,该应用程序在调用以下 firebase 云功能时将帖子发布到 facebook。现在的问题是请求会抛出错误 408:

Error - Post on Facebook { Error: Request failed with status code 408
at createError (/user_code/node_modules/axios/lib/core/createError.js:16:15)
at settle (/user_code/node_modules/axios/lib/core/settle.js:18:12)
at IncomingMessage.handleStreamEnd 
(/user_code/node_modules/axios/lib/adapters/http.js:201:11)
at emitNone (events.js:91:20)
at IncomingMessage.emit (events.js:185:7)
at endReadableNT (_stream_readable.js:978:12)
at _combinedTickCallback (internal/process/next_tick.js:80:11)
at process._tickDomainCallback (internal/process/next_tick.js:128:9)

对我来说,令人兴奋的是,通过邮递员的相同请求成功地没有任何问题:(也许你们中的一个人知道解决这个问题的方法:)

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

export const facebook = functions.region('europe- 
west1').https.onRequest((req, res) => {
  return cors(req, res, () => {

    // Post data
    const data = {
      scheduled: null,
      message: '',
      accessToken: 'token'
    }

    // Get Post data through ID
    db.collection("articles").doc(req.body.id)
    .get().then((doc) => {
      if (doc.exists) {
          data.message = doc.data().meta.facebook.description
          data.scheduled = doc.data().meta.facebook.scheduled
      } else {
          console.log("No such document!");
      }
    }).catch((error) => {
        console.log("Error getting document:", error);
    });

    // Post on Facebook
    if(data.scheduled) {
      const message = data.message
      const access_token = data.accessToken
      axios.post('https://graph.facebook.com/1188810447962053/feed', {
        message,
        access_token
      })
      .then((response) => {
        res.send(200, 'Success - Posted on Facebook', response)
      })
      .catch((error) => {
        res.send(400, 'Error - Post on Facebook', error);
      });
    }
  })
});

【问题讨论】:

  • 这似乎不是来自 API 的实际错误响应,但您的请求甚至没有得到那么远 - 408 是请求超时。检查服务器上的网络路由、防火墙设置等。
  • 事情是我之前使用了另一个 axios 请求来实际调用这里显示的这个函数。这就是为什么我很困惑为什么它不能执行这个:(
  • 您的意思是对graph.facebook.com 的另一个请求? (如果不是,我看不出这有什么关系。)
  • 您的 Firebase 项目是否启用了结算功能?否则,您将无法向 Google 控制之外的服务发出传出请求。
  • 在 firebase 和 gcloud 上都启用了计费功能。

标签: facebook-graph-api google-cloud-functions axios


【解决方案1】:

我的解决方案:

事实证明,post 请求适用于“request-promise”npm 包,但它根本不适用于 axios。

这是我现在使用的相应代码:

const postToFacebook = {  
  method: 'POST',
  uri: `https://graph.facebook.com/${pageId}/feed`,
  qs: {
    access_token: access_token,
    message: postMessage
  }
};
request(postToFacebook)

【讨论】:

    【解决方案2】:

    您可以在 firebase 云函数中使用 axios,如下所示:

    
    exports.myFunction = functions.https.onRequest((req, res) => {
        return new Promise((resolve, reject) => {
            const payload = {
                "key": "value"
            };
    
            api.post("api.example.com", payload)
                .then(resolve)
                .catch(reject);
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2017-10-10
      • 2020-10-30
      • 2022-01-21
      • 2019-06-13
      • 2019-10-17
      • 2018-04-13
      • 1970-01-01
      • 2018-06-15
      • 2019-12-23
      相关资源
      最近更新 更多