firebase - Firebase:如何在实时数据库 onCreate 函数中触发 HTTPs onRequest 函数?
问题描述
在我的 VueJS 电子商务应用程序中单击“结帐”按钮后,将在我的 Firebase“订单”子节点中创建一个包含订单参数的新“订单”字段。我创建了一个实时数据库 onCreate 'newBuyerOrder' 函数,一旦创建了新的“订单”字段,就会向用户发送一封电子邮件,通知他这个新订单。现在,我还想调用我使用 HTTPs onRequest 函数构建的 REST API“/checkout”,以通过 Paypal REST SDK 处理订单。我怎样才能做到这一点?
我尝试过的一种解决方法是构建客户端浏览器可以调用的 HTTPs onCall 函数,以通过带有订单参数的 Paypal 处理订单,并使用“newBuyerOrder”onCreate 函数单独发送电子邮件。但不幸的是,HTTPs onCall 不允许客户端重定向。而且,你瞧,在进行 Paypal REST 调用时需要客户端重定向,因此 HTTPs onCall 不适用于我的目的。
在函数/package.json
"dependencies": {
"@sendgrid/mail": "^6.3.1",
"firebase-admin": "~6.0.0",
"firebase-functions": "^2.1.0",
"paypal-rest-sdk": "^1.8.1"
}
在函数/src/index.ts
import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
import * as sendgrid from '@sendgrid/mail'
import * as paypal from 'paypal-rest-sdk'
// init firebase admin
admin.initializeApp()
// set sendgrid api in function config
const SENDGRID_API_KEY = ...
// set paypal api in function config
paypal.configure({
...
});
// setup paypal payment object and redirect user to paypal payment
page
export const checkout = functions.https.onRequest((req, res) => {
// 1.Set up a payment information object, Build PayPal payment
request
const payReq = JSON.stringify({
...
})
// 2.Initialize the payment and redirect the user.
paypal.payment.create(payReq, (error, payment) => {
if (error) {
// handle error
} else {
// redirect to paypal approval link
for (let i = 0; i < payment.links.length; i++) {
if (payment.links[i].rel === 'approval_url') {
res.redirect(302, payment.links[i].href)
}
}
}
})
})
// send email and trigger paypal checkout api given new buyer order
export const newBuyerOrder = functions.database
.ref('users/{userId}/orders/{orderId}')
.onCreate((snapshot, context) =>
// expected solution to call 'checkout' REST API from above
// send email via sendgrid
const msg = {...}
return sendgrid.send(msg)
})
我希望一旦在实时数据库中创建了新的订单字段并且客户端被重定向到 Paypal 批准页面,就会调用“/checkout”API。
解决方案
从另一个 Cloud Functions 调用一个 Cloud Functions 几乎从来都不是一个好主意。一方面,您需要为两次调用付费,而其中的工作只需一次即可完成。有更好的方法来重用代码。
例如,您可以将支付代码包含在实时数据库触发的 Cloud Function? 中。
或者,您可以提取该 Cloud Function 的业务功能,并将其放入常规 JavaScript 函数中,以便您从实时数据库触发的函数中调用。
数据库触发器来自实时数据库到 Cloud Functions。不涉及客户端应用程序代码,因此也无法重定向。
如果您想在操作完成后将响应发送回客户端,您通常会将客户端的响应写回数据库中客户端监视的位置。例如,您可以将响应写入:/users/{userId}/order_results/{orderId}
,然后客户端可以在此位置等待值。
推荐阅读
- javascript - 数据不存在时处理错误 Axios Catch
- javascript - Webpack:ts-loader 在输出目录中生成 d.ts 文件而不是 js 文件
- discord - 我无法触发帮助命令 (discord.py)
- flutter - Cloud Firestore 子集合的 Flutter 模型类
- reactjs - 行上的多个条件过滤器并应用颜色反应表
- rdbms - 如何在给定的关系模式中找到依赖类型?
- sql - Hive 找出维度表中缺失的记录?
- sql - 国家、州、城市的数据库
- go - 为什么我们在这个 append 函数调用中需要三个点?
- python - 我正在尝试使用 pandas 库在 python 中创建一个数据框。但低于错误