#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. Он работал по старому сценарию.