首页 > 解决方案 > 使用 Azure Function Core Tools 将事件中心消息写入本地文件

问题描述

我有一个事件中心触发的 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 函数核心工具运行此函数时,项目根目录(或我能找到的任何地方)中没有“messages.json”文件。请就如何在使用 Azure Function Core Tools 执行时将此 JSON 数据写入本地磁盘提出建议。

标签: typescriptazure-functionsazure-functions-core-tools

解决方案


这里的问题是这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;

另一种方法是使用此SO 线程中涵盖promisify的方法。fs


推荐阅读