在 Azure Functions 中通过 nodeJS 生成 excel

Posted

技术标签:

【中文标题】在 Azure Functions 中通过 nodeJS 生成 excel【英文标题】:generate excel via nodeJS in Azure Functions 【发布时间】:2021-11-08 14:47:15 【问题描述】:

我有带有 expressJS 和 excel4node 库的 nodejs 应用程序,它在本地机器上运行。 我正在向此服务器发送 REST 消息,它会返回我的 excel 二进制文件。

我想将其移至 Azure Functions,但遇到了问题。即使是简单的应用程序(取自示例)也没有在那里运行。也许有人有建议如何解决这个问题?

const createHandler =  require('azure-function-express').createHandler;
const express = require('express');
const xl = require('excel4node')
// Create express app as usual
const app = express();
app.post('/api/hello-world', (req, res) => 
    var wb = new xl.Workbook();
    var ws = wb.addWorksheet('S');
    ws.cell(1, 1).string('A');
    wb.write(`FileName.xlsx`, res);
);
// Binds the express app to an Azure Function handler
module.exports = createHandler(app);

这是我看到的错误:

Microsoft.AspNetCore.Server.Kestrel.Core: Response Content-Length mismatch: too many bytes written (3790 of 3569).

有人知道如何解决它,或者有一个通过 NodeJS 在 Azure Functions 中生成 excel 的示例

【问题讨论】:

【参考方案1】:

以防万一其他人在寻找答案时遇到麻烦(就像我一样)。这对我有用:

var xl = require('excel4node');

const tryCreate = async (obj) => 
    let wb = new xl.Workbook();

    const buffer = await wb.writeToBuffer();
    return 
        setEncoding: 'binary',
        // status: 200, /* Defaults to 200 */
        body: buffer
    ;


module.exports = async function (context, req) 
    try 
        context.res = await tryCreate(req.body);
     catch (error) 
        context.log.error(error, new Date().toISOString());
    

【讨论】:

一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习。【参考方案2】:

谢谢MikeUrnun 和toburger。发布您的建议作为答案,以帮助其他社区成员。

“这可能与您使用 azure-function-express middleware 以及它可能无法将您的有效负载映射到底层 Kestrel 服务器知道的正确响应上下文有关。如果您切换到替代中间件,确保它将请求/响应映射到上下文对象"

您可以尝试以下代码解决方法:

task 
    let! _ = app func req.HttpContext
    do! req.HttpContext.Response.Body.FlushAsync()
    return Microsoft.AspNetCore.Mvc.EmptyResult()

您可以参考Azure Functions NodeJS Response Content-Length Error和ASP.Net Core middleware cannot set status code on exception because "response has already started"

【讨论】:

嗨戴夫,我按照迈克的建议,摆脱了这个错误,但现在我无法返回生成的 excel 的二进制数据。这个库 excel4node 应该与 express 一起使用,我可以在其中使用: wb.write(FileName.xlsx, res);这行代码正在向我发送二进制数据(其中 res 是响应),现在我试图遵循相同的结构但有上下文,它返回 200 但没有任何正文。你有什么想法吗? wb.write(FileName.xlsx, context.res);

以上是关于在 Azure Functions 中通过 nodeJS 生成 excel的主要内容,如果未能解决你的问题,请参考以下文章

在菜单中通过functions.php使用自定义字段默认图像[关闭]

“dotnet publish”命令行跳过部署到 Azure Functions

如何在 Azure 流分析中通过 IotHub.ConnectionDeviceId 对延迟函数进行分区?

在新门户中通过 powershell 创建 azure 存储容器

在 Azure 上的 WCF 中通过 SSL 配置 webHTTP 和 NetHTTP 绑定

使用另一个项目中的 Azure Functions