使用 AXIOS POST 通过 firebase 中的云函数调用第 3 方 api

Calling a 3rd party api through a cloud function in firebase with AXIOS POST

我正在尝试在首次用户登录使用某些文本并需要 api 密钥的网站时使用 Axios POST 进行 api 调用。 我做了基本的初始化工作,比如上面的 const functions = require('firebase-functions')var axios = require('axios')

exports.addSummaryMessage = functi ons.auth.user().onCreate(async (user) => {

    const response = await axios.post(
        'https://example.com/stuff',
        {
            headers: {
                contentType: 'content/json',
                Authorization:
                    'Bearer APIKEY',
            },
            text: 'wooooww',
        }
    )

    await admin.firestore().collection('messages').add({
        name: 'Firebase Bot',
        profilePicUrl: '/images/firebase-logo.png', // Firebase logo
        text: JSON.stringify(response),
        timestamp: admin.firestore.FieldValue.serverTimestamp(),
    })
})

在我的函数日志中,我收到类似 >addSummaryMessage 的消息 函数执行耗时 231 毫秒。完成状态:错误

我可以跟踪从 api 收到的调用,它从不注册或发回输出。所有的 CORS 都有 request, response,我认为我无法使用 functions.auth.user().onCreate() 这里出了什么问题?我的 API 使用这个 raw

在 reqbin 中工作
POST /stuff
Authorization: Bearer APIKEY
Host: example.com
Accept: application/json
Content-Type: application/json
Content-Length: 30

{
  "text":"wooooww"
    
}

编辑:让它在函数中使用此文本:

    var data = {}
    var url =
        'https://example.com'
    var resp
    await axios
        .post(url, data, {
            headers: {
                contentType: 'content/json',
                Authorization:
                    'Bearer API Key',
            },
        })
        .then((res) => {
            resp = res.data.stuff

            admin.firestore().collection('messages').add({
                name: 'Firebase Bot',
                profilePicUrl: '/images/firebase-logo.png', // Firebase logo
                text: resp,
                timestamp: admin.firestore.FieldValue.serverTimestamp(),
            })
        })
        .catch((err) => {
            console.log(err)
        })

编辑 2 我的 api 不需要文本到 运行,我很困惑如何通过 data 将文本传递到 post 这对我有用

    var userText = 'wow'
    var data = {}
    data['text'] = userText
    var url = ....

如果没有更多详细信息,很难确定您遇到的问题。但是你提到第二个代码有效。

另外我们可以看出你是不正确的managing the life cycle of your Cloud Function: you don't return a Promise. This typically results in some erratic behavior: the Cloud Function

所以下面应该可以工作(当然未经测试,因为我们不知道通过 Axios 调用的 API):

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();   // <= This is important

exports.addSummaryMessage = functions.auth.user().onCreate(async (user) => {

    const response = await axios.post(
        'https://example.com/stuff',
        {
            headers: {
                contentType: 'content/json',
                Authorization:
                    'Bearer APIKEY',
            },
            text: 'wooooww',
        }
    )

    await admin.firestore().collection('messages').add({
        name: 'Firebase Bot',
        profilePicUrl: '/images/firebase-logo.png', // Firebase logo
        text: JSON.stringify(response),
        timestamp: admin.firestore.FieldValue.serverTimestamp(),
    })

    return null;   // <= This is important
})