Не удается загрузить файл в хранилище больших двоичных объектов Azure с помощью узла функций Azure

#node.js #azure #azure-functions #serverless

#node.js #azure #azure-функции #бессерверный

Вопрос:

ПРИМЕЧАНИЕ: Здесь нет проблемы, проблема была в расположении файла моего скрипта functions.json. Он указывал на старый файл сценария. В ту минуту, когда я указал на новый, он начал работать.

Я не уверен, почему это происходит, у меня есть блок try-catch, и функция никогда не попадает в блок catch, но изображение, которое я пытаюсь загрузить, никогда не отображается в контейнере.

Я новичок в NODEJS. Поскольку я не могу добиться того же, используя функции C #, я решил записать это в узле.

Проблема: запуск темы служебной шины функций Azure, получение полезной нагрузки сообщения и получение скриншота страницы с помощью puppeteer. Выходные данные из буфера представлены в виде буфера, я пытаюсь загрузить это в большой двоичный объект хранилища Azure.

 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:

Согласно предоставленной вами информации, вы хотите использовать dymaic name в бинировании вывода хранилища больших двоичных объектов Azure. Если это так, мы не можем использовать context.bindings.<> для его реализации. Для получения более подробной информации, пожалуйста, обратитесь к здесь и здесь

Если вы хотите это реализовать, у вас есть следующие два варианта.

если вы определяете тело сообщения как 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;

 

Мое сообщение
введите описание изображения здесь

Результат введите описание изображения здесь

Комментарии:

1. Большое спасибо. Покопавшись, я понял, что проблема связана с расположением файла скрипта functions.json. Он работал по старому сценарию.