0

我有带有 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 的示例

4

2 回答 2

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());
    }
}
于 2021-12-11T09:44:28.260 回答
0

谢谢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 Error and ASP.Net Core middleware cannot set status code on exception because "response has already started"

于 2021-09-23T10:10:08.287 回答