Записать сообщения концентратора событий в локальный файл с помощью Azure Tools Core Tools - PullRequest
0 голосов
/ 07 марта 2020

У меня есть функция TypeScript, запускаемая концентратором событий Azure. Я пытаюсь записать события, полученные в локальный файл при выполнении с Azure Function Core Tools. Это просто для того, чтобы помочь с разработкой, а не чем-то, что я буду делать на производстве или внутри самого Azure.

import { AzureFunction, Context } from "@azure/functions"
import fs = require('fs');

const eventHubTrigger: AzureFunction = async function (context: Context, eventHubMessages: any[]): Promise<void> {
    context.log(`Eventhub trigger function called for message array ${eventHubMessages}`);

    eventHubMessages.forEach((message, index) => {
        context.log(`Processed message ${message}`);

        let data = JSON.stringify(message, null, 2);
        fs.writeFile('messages.json', data, { flag: 'a+' }, (err) => {
            if (err) throw err;
            context.log('Data written to file');
        });

    });
};

export default eventHubTrigger;

Когда я запускаю эту функцию с помощью Azure Function Core Tools, в проекте отсутствует файл «messages. json» root (или где-либо, где я могу найти). Посоветуйте, пожалуйста, как я могу записать эти JSON данные на локальный диск при выполнении с Azure Function Core Tools.

1 Ответ

0 голосов
/ 09 марта 2020

Проблема здесь в том, что fs.writeFile является асинхронной операцией, но функция не ждет ее, так как функция сделана async без await.

Вот один из способов, которым вы можете исправить это, не используя async и вызывая context.done() вместо

import { AzureFunction, Context } from "@azure/functions"
import fs = require('fs');

const eventHubTrigger: AzureFunction = function (context: Context, eventHubMessages: any[]): Promise<void> {
  context.log(`Eventhub trigger function called for message array ${eventHubMessages}`);

  let dataToWrite = "";
  eventHubMessages.forEach((message, index) => {
    context.log(`Processed message ${message}`);

    let data = JSON.stringify(message, null, 2);
    dataToWrite += data;
  });

  fs.writeFile('messages.json', dataToWrite, { flag: 'a+' }, (err) => {
    if (err) throw err;
    context.log('Data written to file');
    context.done();
  });
};

export default eventHubTrigger;

Другим способом было бы promisify fs методы, описанные в этом SO нить .

...