node.js - 条纹和 Firestore

标签 node.js firebase google-cloud-firestore firebase-admin

我正在尝试使用 Firestore 让 Stripe 服务器代码正常工作。我找到了使用 Firebase RTDB 的示例服务器代码,但在将此代码转换为使用 Firestore 时遇到问题。

使用实时数据库的原始 Firebase 函数代码:

const functions = require('firebase-functions')
const admin = require('firebase-admin')

admin.initializeApp(functions.config().firebase);

const stripe = require('stripe')(functions.config().stripe.testkey)



exports.stripeCharge = functions.database
                                .ref('/payments/{userId}/{paymentId}')
                                .onWrite(event => {



  const payment = event.data.val();
  const userId = event.params.userId;
  const paymentId = event.params.paymentId;


  // checks if payment exists or if it has already been charged
  if (!payment || payment.charge) return;

  return admin.database()
              .ref(`/users/${userId}`)
              .once('value')
              .then(snapshot => {
                  return snapshot.val();
               })
               .then(customer => {

                 const amount = payment.amount;
                 const idempotency_key = paymentId;  // prevent duplicate charges
                 const source = payment.token.id;
                 const currency = 'usd';
                 const charge = {amount, currency, source};


                 return stripe.charges.create(charge, { idempotency_key });

               })

               .then(charge => {
                   admin.database()
                        .ref(`/payments/${userId}/${paymentId}/charge`)
                        .set(charge)
                  })


});

我尝试将其转换为使用 Firestore:

const functions = require('firebase-functions')
const admin = require('firebase-admin')

admin.initializeApp(functions.config().firebase)

const stripe = require('stripe')(functions.config().stripe.testkey)

exports.stripeCharge = functions.firestore
  .document('/users/{userId}/payments/{paymentId}')
  .onWrite(event => {
    const payment = event.data
    const userId = event.params.userId
    const paymentId = event.params.paymentId

    // checks if payment exists or if it has already been charged
    if (!payment || payment.charge) return

    return admin.firestore
      .document(`/users/${userId}`)
      .get()
      .then(snapshot => {
        return snapshot
      })
      .then(customer => {
        const amount = payment.amount;
        const idempotency_key = paymentId  // prevent duplicate charges
        const source = payment.token.id
        const currency = 'usd'
        const description = 'irl Map Fine Print'
        const charge = {amount, currency, source}

        return stripe.charges.create(charge, { idempotency_key })
     })
     .then(charge => {
       admin.firestore
        .fieldValue(`/users/${userId}/payments/${paymentId}/charge`)
        .set(charge)
     })
   })

我的版本失败,错误提示 admin.firestore.document 不是函数。

最佳答案

这个更新的代码将适合您!您的代码存在几个问题:缺少括号... fieldValue 使用不正确(尽管我不确定如何正确使用它)...“document”应该是“doc”

但这有效:

const functions = require('firebase-functions')
const admin = require('firebase-admin')

admin.initializeApp(functions.config().firebase)

const stripe = require('stripe')(functions.config().stripe.token)

exports.stripeCharge = functions.firestore
  .document('/users/{userId}/payments/{paymentId}')
  .onWrite(event => {
    const payment = event.data.data()
    const userId = event.params.userId
    const paymentId = event.params.paymentId

    // checks if payment exists or if it has already been charged
    if (!payment || payment.charge) return

    return admin.firestore()
      .doc(`/users/${userId}`)
      .get()
      .then(snapshot => {
        return snapshot
      })
      .then(customer => {
        const amount = payment.price * 100 // amount must be in cents
        const idempotency_key = paymentId  // prevent duplicate charges
        const source = payment.token.id
        const currency = 'usd'
        const description = 'irl Map Fine Print'
        const charge = {amount, currency, source}

        return stripe.charges.create(charge, { idempotency_key })
     })
     .then(charge => {
       admin.firestore()
        .doc(`/users/${userId}/payments/${paymentId}`)
        .set({
          charge: charge
        }, { merge: true })
     })
   })

关于node.js - 条纹和 Firestore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48162765/

相关文章:

javascript - 将带有预签名 URL 的分段上传从 aws javascript sdk v2 迁移到 v3

javascript - bluebird - 函数返回 promise 对象而不是实际数据

Firebase 存储 : How to overcome custom claims limits (1000 bytes)

csv - 如何将 CSV 文件导入 Firebase

flutter - Flutter:根据Cloud Firestore中是否存在文档更新图标小部件

firebase - 如何发出 firestore REST API PATCH 请求?

javascript - 检测客户端断线WebSocket

node.js - Mocha 茶兑现多项 promise

ios - 将 FirebaseDataSnapshot 作为字符串添加到数组 (Swift 3)

javascript - 在 Firestore 的循环中使用带有批处理方法的更新