Firebase 函数:参数 "data" 的值不是有效的 Firestore 文档

Firebase functions: Value for argument "data" is not a valid Firestore document

我正在尝试使用下面的代码学习 oAuth2 的 fireship 教程。

所有功能都已正确初始化,但当我尝试通过推特授权应用程序时出现此错误消息。错误信息如下。

⚠ functions: Error: Value for argument "data" is not a valid Firestore document. Cannot use "undefined" as a Firestore value (found in field "accessToken"). If you want to ignore undefined values, enable ignoreUndefinedProperties.

代码如下:

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

// Database reference
const dbRef = admin.firestore().doc('tokens/demo')

const TwitterApi = require('twitter-api-v2').default
const twitterClient = new TwitterApi({
  clientId: 'aabbcc',
  clientSecret: 'aabbcc',
})

const callbackURL =
  'http://127.0.0.1:5001/primussoft-74a49/us-central1/callback'

// STEP 1 - Auth URL
exports.auth = functions.https.onRequest(async (request, response) => {
  const { url, codeVerifier, state } = twitterClient.generateOAuth2AuthLink(
    callbackURL,
    { scope: ['tweet.read', 'tweet.write', 'users.read', 'offline.access'] }
  )

  // store verifier
  await dbRef.set({ codeVerifier, state })

  response.redirect(url)
})

// STEP 2 - Verify callback code, store access_token
exports.callback = functions.https.onRequest(async (request, response) => {
  const { state, code } = request.query

  const dbSnapshot = await dbRef.get()
  const { codeVerifier, state: storedState } = dbSnapshot.data()

  if (state !== storedState) {
    return response.status(400).send('Stored tokens do not match!')
  }

  const {
    client: loggedClient,
    accessToken,
    refreshToken,
  } = twitterClient.loginWithOAuth2({
    code,
    codeVerifier,
    redirectUri: callbackURL,
  })

  await dbRef.set({ accessToken, refreshToken })

  const { data } = loggedClient.v2.me() // start using the client if you want

  response.send(data)
})

// STEP 3 - Refresh tokens and post tweets
exports.tweet = functions.https.onRequest(async (request, response) => {
  const { refreshToken } = dbRef.get().data()

  const {
    client: refreshedClient,
    accessToken,
    refreshToken: newRefreshToken,
  } = twitterClient.refreshOAuth2Token(refreshToken)

  await dbRef.set({ accessToken, refreshToken: newRefreshToken })

  //   const { data } = await refreshedClient.v2.tweet(
  //     nextTweet.data.choices[0].text
  //   )

  const { dataone } = { id: 'testid', text: 'a tweet from me' }

  response.send(dataone)
})

exports.tweet = functions.https.onRequest((request, response) => {})

我实际上是在尝试按照 fireship 的教程在这个 link https://youtu.be/V7LEihbOv3Y

如有任何帮助,我们将不胜感激。

refreshOAuth2Token方法returns也是一个承诺。尝试添加 await,如下所示:

const {
  client: refreshedClient,
  accessToken,
  refreshToken: newRefreshToken,
} = await twitterClient.refreshOAuth2Token(refreshToken)