在 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 存储容器