我在直接從RevenueCat 的檔案中設定 webhook 端點 API 時遇到問題。
我的代碼幾乎與檔案中的代碼一模一樣,所以我不知道為什么會觸發此錯誤,而且我對此類內容的經驗不足,無法解決此問題。這是我得到的錯誤:
(parameter) res: functions.Response<any>
Argument of type '(req: Request, res: Response<any>) => Response<any> | Promise<void | Response<any>>' is not assignable to parameter of type '(req: Request, resp: Response<any>) => void | Promise<void>'.
Type 'Response<any> | Promise<void | Response<any>>' is not assignable to type 'void | Promise<void>'.
Type 'Response<any>' is not assignable to type 'void | Promise<void>'.
Type 'Response<any>' is missing the following properties from type 'Promise<void>': then, catch, finally, [Symbol.toStringTag]ts(2345)
老實說,我不確定它要求我改變什么。有任何想法嗎?這是我的代碼:
import * as functions from 'firebase-functions'
import { PubSub } from '@google-cloud/pubsub'
const pubsubClient = new PubSub({projectId: '<PROJ_ID>'})
function isAuthorized(req: functions.https.Request) {
// Check authorization header
if (!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) {
return false
}
const authToken = req.headers.authorization.split('Bearer ')[1]
if (authToken !== '<MY_AUTH_TOKEN>') {
return false
}
return true
}
// Respond to incoming message
export const revenueCatApi = functions.https.onRequest((req, res) => { // *** ERROR DETECTED HERE
// Only allow POST request
if (req.method !== 'POST') {
return res.status(403).send('Forbidden')
}
// Make sure the auth key matches what we set in the Revenue Cat dashboard
if (!isAuthorized(req)) {
return res.status(401).send('Unauthorized')
}
const rc = req.body as RCEvent
var topic: RCTopic = ''
switch (rc.event.type) {
case 'INITIAL_PURCHASE':
topic = 'rc-initial-purchase'
break
case 'NON_RENEWING_PURCHASE':
topic = 'rc-non-renewing-purchase'
break
case 'RENEWAL':
topic = 'rc-renewal'
break
case 'PRODUCT_CHANGE':
topic = 'rc-product-change'
break
case 'CANCELLATION':
topic = 'rc-cancellation'
break
case 'BILLING_ISSUE':
topic = 'rc-billing-issue'
break
case 'SUBSCRIBER_ALIAS':
topic = 'rc-subscriber-alias'
break
default:
console.log('Unhandled event type: ', rc.event.type)
return res.sendStatus(200)
}
// Set the pub/sub data to the event body
const dataBuffer = Buffer.from(JSON.stringify(rc))
// Publishes a message
return pubsubClient.topic(topic)
.publish(dataBuffer)
.then(() => res.sendStatus(200))
.catch(err => {
console.error(err)
res.sendStatus(500)
return Promise.reject(err)
})
})
exports.handleInitialPurchase = functions.pubsub
.topic('rc-initial-purchase')
.onPublish(async (message, context) => {
...
})
/* Other pubsub functions below */
RC事件:
interface RCEvent {
api_version: string
event: {
aliases: string[]
app_id: string
app_user_id: string
country_code: string
currency: string
entitlement_id: string
entitlement_ids: string[]
environment: string
event_timestamp_ms: number
expiration_at_ms: number
id: string
is_family_share: boolean
offer_code?: string
original_app_user_id: string
original_transaction_id: string
period_type: string
presented_offering_id: string
price: number
price_in_purchased_currency: number
product_id: string
purchased_at_ms: number
store: string
subscriber_attributes: any
takehome_percentage: number
transaction_id: string
type: string
}
}
uj5u.com熱心網友回復:
錯誤訊息告訴您 TypeScript 已確定您的函式的簽名是這樣的:
(req: Request, res: Response<any>) => Response<any> | Promise<void | Response<any>>
這意味著它需要一個Request和Response作為引數,并且可以回傳的任何一個Response<any>或Promise<void | Response<any>>。這與它只回傳voidor的要求不兼容Promise<void>。
您的函式可能回傳三件事:
return res.status(403).send('Forbidden')
return res.status(401).send('Unauthorized')
return pubsubClient.topic(topic)
前兩件事您并沒有真正嘗試回傳。您只是想發送回應并提前結束。第三件事是承諾。
不回傳res.status(403).send('Forbidden'). 如果您想提前終止函式而不做任何進一步的作業,只需回傳 null。
res.status(403).send('Forbidden')
return null
為您沒有承諾等待的兩個退貨執行此操作。這將使您的函式宣告它只回傳一個 promise 或 null,這與函式的 TypeScript 要求兼容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/407294.html
標籤:
上一篇:如何根據物件屬性值應用介面
下一篇:離子角中的離子選擇
