使用 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
})
我正在尝试在首次用户登录使用某些文本并需要 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
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
})