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
}
}
進捗は普通。
健康のために早く寝よう。
この記事が気に入ったらサポートをしてみませんか?