【问题标题】:generate excel via nodeJS in Azure Functions在 Azure Functions 中通过 nodeJS 生成 excel
【发布时间】: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 的示例

【问题讨论】:

    标签: node.js azure azure-functions excel4node


    【解决方案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】:

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

    “这可能与您使用 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 ErrorASP.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);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多