>source

참고 : 여기에는 문제가 없습니다. 문제는 내 functions.json 스크립트 파일 위치에있었습니다. 이전 스크립트 파일을 가리키고있었습니다. 새로운 것을 가리 키 자마자 작동하기 시작했습니다.

왜 이런 일이 발생하는지 잘 모르겠습니다. try-catch 블록이 있고 함수가 catch 블록에 도달하지 않지만 업로드하려는 이미지는 컨테이너에 표시되지 않습니다.

저는 NODEJS를 처음 사용합니다. C # 함수를 사용하여 동일한 결과를 얻을 수 없기 때문에 노드에 작성하기로 결정했습니다.

문제 : Azure 함수 서비스 버스 항목 트리거, 메시지 페이로드 가져 오기 및 인형을 사용하여 페이지의 스크린 샷 캡처. 버퍼의 출력은 버퍼 형식이며,이를 Azure 저장소 Blob에 업로드하려고합니다.

import { AzureFunction, Context } from "@azure/functions";
import { ServiceBusMessage } from "@azure/service-bus";
import * as puppeteer from 'puppeteer';
import * as BlobServiceClient from "azure-storage";
import { Readable } from 'stream';
const serviceBusTopicTrigger: AzureFunction = async function (context: Context, mySbMsg: ServiceBusMessage): Promise<void> {
    try {
        const promotionId = context.bindingData.userProperties.promotionId;
        context.log('Player Screen Grabber ServiceBus topic trigger function processing message started', promotionId);
        const playerURL = process.env['playerURL'] + promotionId + '/';
        let browser = await puppeteer.launch({ headless: true });
        let page = await browser.newPage();
        await page.goto(playerURL, { waitUntil: 'networkidle2' });
        await page.setViewport({ width: 1920, height: 1080 });
        const screenshotBuffer = await page.screenshot({
            encoding: 'binary'
        });
        await page.close();
        await browser.close();
        const newPlayerScreenShotStream = new Readable({
            read() {
                this.push(screenshotBuffer);
            },
        });
        var fileName = promotionId + ".png";
        context.bindings.fileName = fileName;
        context.bindings.storage = screenshotBuffer;
        context.done();
        context.log('Player Screen Grabber ServiceBus topic trigger function processing message ended', promotionId);
    }
    catch (error) {
        throw error;
    }
};

  • 답변 # 1

    제공 한 정보에 따라 Azure 함수 Blob 저장소 출력 비닝에서 동적 이름을 사용하려고합니다. 그렇다면 사용할 수 없습니다. context.bindings.<> 그것을 구현합니다. 자세한 내용은 여기와 여기를 참조하십시오.

    구현하려는 경우 다음 두 가지 선택 사항이 있습니다.

    Azure Functions 바인딩 식 패턴 사용

    메시지 본문을 json으로 정의하면 함수에서 바인딩 표현식으로 값을 직접 읽을 수 있습니다.

    예를 들면

    내 메시지

    function.json

    {
      "bindings": [
        {
          "name": "mySbMsg",
          "type": "serviceBusTrigger",
          "direction": "in",
          "topicName": "",
          "subscriptionName": "",
          "connection": "MYSERVICEBUS"
        },
        {
          "type": "blob",
          "direction": "out",
          "name": "outputBlob",
          "path": "outcontainer/{fileName}.png",
          "connection": "AzureWebJobsStorage"
        }
      ],
      "scriptFile": "../dist/ServiceBusTopicTrigger1/index.js"
    }
    
    
    

    기능 코드

    import { AzureFunction, Context } from "@azure/functions";
    import * as puppeteer from "puppeteer";
    const serviceBusTopicTrigger: AzureFunction = async function (
      context: Context,
      mySbMsg: any
    ): Promise<void> {
      try {
        context.log("ServiceBus topic trigger function processed message", mySbMsg);
        const promotionId = context.bindingData.userProperties.promotionId;
        const playerURL =
          "https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node?tabs=v2";
        let browser = await puppeteer.launch({ headless: true });
        let page = await browser.newPage();
        await page.goto(playerURL, { waitUntil: "networkidle2" });
        await page.setViewport({ width: 1920, height: 1080 });
        const screenshotBuffer = await page.screenshot({
          encoding: "binary",
        });
        await page.close();
        await browser.close();
        context.bindings.outputBlob = screenshotBuffer;
      } catch (error) {
        throw error;
      }
    };
    export default serviceBusTopicTrigger;
    
    

    Azure Blob Storage SDK 사용 기능 코드

    import { AzureFunction, Context } from "@azure/functions";
    import * as puppeteer from "puppeteer";
    import { BlobServiceClient } from "@azure/storage-blob";
    const serviceBusTopicTrigger: AzureFunction = async function (
      context: Context,
      mySbMsg: any
    ): Promise<void> {
      try {
        context.log("ServiceBus topic trigger function processed message", mySbMsg);
        const promotionId = context.bindingData.userProperties.promotionId;
        const playerURL =
          "https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node?tabs=v2";
        let browser = await puppeteer.launch({ headless: true });
        let page = await browser.newPage();
        await page.goto(playerURL, { waitUntil: "networkidle2" });
        await page.setViewport({ width: 1920, height: 1080 });
        const screenshotBuffer = await page.screenshot({
          encoding: "binary",
        });
        await page.close();
        await browser.close();
        // the storage account connection string
        const constr = process.env["AzureWebJobsStorage"];
        const blobserviceClient = BlobServiceClient.fromConnectionString(constr);
        const containerClient = blobserviceClient.getContainerClient("output");
        const blob = containerClient.getBlockBlobClient(`${promotionId}.png`);
        await blob.uploadData(screenshotBuffer);
      } catch (error) {
        throw error;
      }
    };
    export default serviceBusTopicTrigger;
    
    
    

    내 메시지

    결과

관련 자료

  • 이전 statsd - 동일한 패턴의 카운터 및 타이머가 작동하지 않음 (Prometheus)
  • 다음 python - 팬더 데이터 프레임은 전체 열을 동일한 크기의 개체로 바꿉니다