NodeJS 使用AXIOS POST通过Firebase中的云函数调用第三方API

fd3cxomn  于 2023-10-17  发布在  Node.js
关注(0)|答案(1)|浏览(146)

我试图在第一个用户登录使用一些文本并需要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,我不认为我可以用函数.auth.user().onCreate()得到它。我的API在reqbin中使用这个原始

POST /stuff
Authorization: Bearer APIKEY
Host: example.com
Accept: application/json
Content-Type: application/json
Content-Length: 30

{
  "text":"wooooww"
    
}

EDIT:在函数中使用此文本:

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将文本传递到帖子中,这对我很有效。

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

tuwxkamq1#

如果没有更多的细节,很难确定你遇到的问题。但是你提到第二个代码是有效的。
此外,我们可以看到,你是不正确的managing the life cycle of your Cloud Function:你不返回一个承诺。这通常会导致一些不稳定的行为:云函数sometimes works and sometimes not...
因此,以下应该可以工作(当然,未经测试,因为我们不知道通过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
})

相关问题