Azure functionsでpngを返す

var d3 = require('d3');
var fabric = require('fabric').fabric;
const {
    JSDOM
} = require('jsdom')
const fs = require('fs');

module.exports = async function (context, req) {
    

    var canvas = new fabric.Canvas('test_canvas');
    canvas.setWidth(500);
    canvas.setHeight(500);

    const document = new JSDOM().window.document
    datasets = [{
            date: "2020-04-01T07:07:14.150Z",
            value: 101
        },
        {
            date: "2020-04-01T07:08:24.150Z",
            value: 108
        },
        {
            date: "2020-04-01T07:09:34.150Z",
            value: 99
        },
        {
            date: "2020-04-01T07:10:44.150Z",
            value: 110
        },
        {
            date: "2020-04-01T07:11:54.150Z",
            value: 100
        },
        {
            date: "2020-04-01T07:12:14.150Z",
            value: 149
        },
        {
            date: "2020-04-01T07:13:24.150Z",
            value: 80
        },
        {
            date: "2020-04-01T07:14:34.150Z",
            value: 100
        },
        {
            date: "2020-04-01T07:15:44.150Z",
            value: 110
        },
        {
            date: "2020-04-01T07:16:54.150Z",
            value: 117
        },
        {
            date: "2020-04-01T07:17:14.150Z",
            value: 112
        },
        {
            date: "2020-04-01T07:18:24.150Z",
            value: 101
        },
        {
            date: "2020-04-01T07:19:34.150Z",
            value: 111
        },
        {
            date: "2020-04-01T07:20:44.150Z",
            value: 107
        },
        {
            date: "2020-04-01T07:21:54.150Z",
            value: 108
        },

    ]



    var w = 400; // 幅 (マージン部分は除く)
    var h = 300; // 高さ (マージン部分は除く)
    var margin = {
        left: 50,
        top: 20,
        bottom: 50,
        right: 20
    };


    // x軸の目盛りの表示フォーマット
    let format = d3.timeFormat("%H:%M");

    datasets = datasets.map(function (d) {
        let timeparser = d3.timeParse("%Y-%m-%dT%H:%M:%S.%LZ");
        // 日付のデータをパース
        return {
            date: timeparser(d.date),
            value: d.value
        };
    });

    // (a) svg 要素の追加
    var g = d3.select(document.body).append('svg')
        .attr('xmlns', 'http://www.w3.org/2000/svg')
        .attr('width', w + margin.left + margin.right) // svg 要素の幅
        .attr('height', h + margin.top + margin.bottom) // svg 要素の高さ
        .append('g')
        .attr('fill', 'none')
        .attr('transform', `translate(${margin.left}, ${margin.top})`);

    // (b) スケールの定義
    var x = d3.scaleTime()
        // 最小値と最大値を指定しX軸の領域を設定する
        .domain([
            // データ内の日付の最小値を取得
            d3.min(datasets, function (d) {
                return d.date;
            }),
            // データ内の日付の最大値を取得
            d3.max(datasets, function (d) {
                return d.date;
            })
        ])
        .range([0, w]);

    var y = d3.scaleLinear().range([0, h]).domain([
        // 0を最小値として設定
        // データ内のvalueの最大値を取得
        d3.max(datasets, function (d) {
            return d.value;
        }),
        0
    ]);


    // (c) 軸の定義
    let xTicks = 6;
    var xAxis = d3.axisBottom(x)
        // グラフの目盛りの数を設定
        .ticks(xTicks)
        // 目盛りの表示フォーマットを設定
        .tickFormat(format);
    var yAxis = d3.axisLeft(y)
        .tickSize(0)
        .tickFormat(function (d) {
            if (d < 1000) return d;
            else return d / 1000 + "K"
        });

    // (d1) 横軸の追加
    g.append('g')
        .attr('transform', `translate(0, ${h})`)
        .call(xAxis)


    // (d2) 縦軸の追加
    g.append('g')
        .call(yAxis)
        .append('text') // 縦軸のラベル
        .attr('transform', 'rotate(-90)')

    // 折れ線の作成関数
    var createLine = d3.line()
        // lineのX軸をセット
        .x(function (d) {
            return x(d.date);
        })
        // lineのY軸をセット
        .y(function (d) {
            return y(d.value);
        })
        // カーブを設定
        .curve(d3.curveCatmullRom.alpha(0.4));

    // (e) 折れ線の追加
    g.append('path')
        .attr('d', createLine(datasets))
        .attr('stroke', 'rgb(133, 167, 204)')
        .attr('fill', 'rgb(133, 167, 204)')
        .attr("stroke-dashoffset", 0)
        .attr("stroke-dasharray", 0)
        .attr('stroke-width', '2')
        .datum(datasets);

    var svg_t = document.body.innerHTML;

    fabric.loadSVGFromString(svg_t, function (objects, options) {
        var obj, stream;

        obj = fabric.util.groupSVGElements(objects, options);
        canvas.add(obj).renderAll();
        stream = canvas.createPNGStream();
        const dest = fs.createWriteStream(
                __dirname + "/dest.png"
              );

        let buffs =[];
        stream.on('data', function (chunk) {
            buffs.push(chunk);
            dest.write(chunk);
        });

        stream.on('end', function () {
            dest.end()
            context.res = {
                status: 200,
                body: Buffer.concat(buffs),
                "headers": {
                    "Content-Type": "image/png"
                }
            };
        });
    });

        
};