node.jsを利用したクローラー作成(51)

システム構成変更の試作など。
合わせて新規リトライアルゴリズムの実装した。
テストはまだ。CloudFunction用の検証環境も微妙に未整備。
やることは多い😅

新設計ではCloudTasks経由でCloudFunctionを呼び出すが、POST method で呼び出したCloudFunctionのreq.bodyにデータが入ってなくて、中々ハマった。
結局Task作成時に正しくcontent-type設定したら取れるようになった。
こんな感じ。(note用に整形したので動くかは知らぬ)

const { CloudTasksClient } = require('@google-cloud/tasks');
const client = new CloudTasksClient();

async function himitufunction(url) {
    const wait = getWaitTime();

    const payload = { url };
    const request = {
     parent: Q_FULLPATH,
     task: {
       name: createTaskId(TASK_FULLPATH, url), // create hash id
       scheduleTime: { seconds: wait }, // 開始時間の指定 
       httpRequest: {
         httpMethod: 'POST',
         url: CLOUD_FUNCTION_URL,
         body: formatedPayload(payload), // obj to Buffered base64
         headers: { "Content-Type": "application/octet-stream" },
         oidcToken: {
           serviceAccountEmail: SERVICE_ACCOUNT,
         },
       }
     }
   };
   await sendTask(request);
}

async function sendTask(request) {
 try {
   await client.createTask(request);
 } catch (err) {
   if (err.code === CODE_ALREADY_EXISTS) {
     //重複送信の場合は無視
     console.info('task already exists.');
   } else {
     //処理を止めたくないため、throw errorはしない
     console.error('create Task unknown error', new Error(err.message));
   }
 } finally {
   return
 }
}

進捗は普通。
健康のために早く寝よう。

この記事が気に入ったらサポートをしてみませんか?