微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法检测是否正在内部调用云函数

如何解决有没有办法检测是否正在内部调用云函数

我有两个云函数一个调用一个。但是我不希望这个云函数被第一个云函数之外的任何其他东西调用我有什么办法可以确定它是由第一个云函数调用的吗?

export const fetchleaderboard = functions
  .runWith(runtimeOptions)
  .region("us-central1")
  .https.onRequest(async (_,response) => {
    try {
      const repo = new leaderboardRepository(new FirestoreleaderboardProvider());
      const count = await repo.readCount();
      const toIterate = Math.ceil(count / 1000);
      const requests = [];

      for (let i = 0; i < toIterate; i++) {
        const config = {
          headers: {
            "Content-Type": "application/json",},} as AxiosRequestConfig;

        const URL = "myurl";
        requests.push(axios.post(URL,JSON.stringify({ pageNumber: i }),config));
      }

      await Promise.all(requests);
    } catch (error) {
      functions.logger.error("fetchleaderboard: Error sending leaderboard",{ structuredData: true });
    }
    response.sendStatus(200);
  });

export const sendleaderboard = functions
  .runWith(runtimeOptions)
  .region("us-central1")
  .https.onRequest(async (request,response) => {
    try {
      const pageNumber = JSON.parse(request.body).pageNumber ?? 0;
      console.log(pageNumber);
    } catch (error) {
      functions.logger.error("fetchleaderboard: Error sending leaderboard",{ structuredData: true });
    }
    response.sendStatus(200);
  });

解决方法

一种解决方案是将 sendLeaderboard 云函数从 HTTPS 更改为 Pub/Sub 函数:“外部”用户/消费者将无法直接调用此云函数。

Pub/Sub Cloud Function 将遵循以下几行:

const { PubSub } = require('@google-cloud/pubsub');
// ...

exports.sendLeaderboard = functions.pubsub.topic('send-leaderboard').onPublish(async (message) => {
    
    try {

        const pageNumber = message.json.pageNumber ?? 0;  // Potentially to be adapted! Convert JSON value to number??

        // ...
        // await ...
        return null;

    } catch (error) {
        console.error(error);
        return null;
    }

});

在第一个 Cloud Functions 函数中,您将调用以下函数

async function publishMessage(messageConfig) {

        const pubSubClient = new PubSub();

        const topicName = messageConfig.topicName;
        const pubSubPayload = messageConfig.pubSubPayload;

        let dataBuffer = Buffer.from(JSON.stringify(pubSubPayload));
        await pubSubClient.topic(topicName).publish(dataBuffer);

}

如下:

messageConfig = {
    topicName: 'send-leaderboard',pubSubPayload: {
        pageNumber: i,// ....
    }
}

await publishMessage(messageConfig);

请注意,如有必要,您可以将 publishMessage(messageConfig); 推送到要传递给 await Promise.all() 的数组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。