【问题标题】:Serverless Excel export in nodejsnodejs 中的无服务器 Excel 导出
【发布时间】:2020-04-16 04:24:16
【问题描述】:

我需要有关如何生成 Excel 的简单帮助,然后在无服务器脱机中单击 API url 将其导出。它应该显示该文件的下载选项。 当我使用 express frework 在普通节点中创建文件时,它正在生成正确的 Excel 文件,我可以轻松下载该文件。 但是,当我在无服务器脱机中使用相同的代码时,我会在下载时收到一个损坏的 .xlsx 文件。 我是离线无服务器的新手,只知道离线创建和使用 lambda 函数的基础知识。 请帮我完成这项任务。

**app.js:**
var Excel = require('exceljs');
var app = express();
var nodeExcel = require('excel-export');
const serverless = require('serverless-http')
app.get("/click", async (req, res) => {

  var workbook = new Excel.Workbook();
  var worksheet = workbook.addWorksheet('My Sheet');
  worksheet.columns = [
    { header: 'Id', key: 'id', width: 10 },
    { header: 'Name', key: 'name', width: 32 },
    { header: 'D.O.B.', key: 'DOB', width: 10 }
  ];
  worksheet.addRow({ id: 1, name: 'John Doe', dob: new Date(1970, 1, 1) });
  worksheet.addRow({ id: 2, name: 'Jane Doe', dob: new Date(1965, 1, 7) });

  await workbook.xlsx.writeFile('./temp.xlsx')

  var fileName = 'temp.xlsx';

  res.setHeader('Content-Type', 'application/octet-stream');
  res.setHeader("Content-Disposition", "attachment; filename=" + fileName);
  await workbook.xlsx.write(res);


})
module.exports.handler = serverless(app);



**Serverless.yml:**
plugins:
  - serverless-offline

provider:
  name: aws
  runtime: nodejs10.x

custom:
  serverless-offline:
    host: '0.0.0.0'   
functions:
      app:
        handler: route/app.handler  
        events:
           - http:
                path: /click
                method: get  

【问题讨论】:

  • 请提供一些你试过的代码,处理函数和处理函数
  • 我为此使用 node-excel-export 模块。我正在创建演示 .xlsx 文件,如本模块中所述,最终结果是损坏的 .xlsx 文件。目前我无法发送代码。

标签: node.js excel amazon-web-services serverless serverless-offline


【解决方案1】:

终于有了解决方案,可以是暂时的,但很容易解决问题。 我能够在本地系统上下载文件。 因此,在服务器端,您可以轻松使用静态文件方法,在点击链接时根据文件扩展名轻松下载或打开文件。 在客户端,您可以轻松调用该方法。 如果这些是 application/octet-stream 文件而不是浏览器本身的文件下载, 如果是图片/pdf文件,那么它会很容易在浏览器中打开。

由于我正在研究无服务器离线,它提供了一个名为“serverless-aws-static-file-handler”的简单包。看看:https://www.npmjs.com/package/serverless-aws-static-file-handler

此函数将从路径中获取文件并从处理程序上提供的路径返回文件,该处理程序适用于 lambda 的异步事件调用。

这是我的一段代码。如果你发现有问题,请纠正。 对于图像等二进制文件,您需要添加插件链接和自定义 apigateway BinaryMediaType。对于其他文件,它也可以在没有它们的情况下工作

 #index.js# file
    const express = require('express')
    const app = express()
    const sls = require('serverless-http')
    const path=require('path')
    const StaticFileHandler = require('serverless-aws-static-file-handler')
    var excel = require('exceljs');
    const clientFilesPath = path.join(__dirname, "public")
    const fileHandler = new StaticFileHandler(clientFilesPath)
    module.exports.excel = async (event, context) => {
        const workbook = new excel.Workbook();
        var worksheet = workbook.addWorksheet('My Sheet');
        worksheet.columns = [
            { header: 'Id', key: 'id', width: 10 },
            { header: 'Name', key: 'name', width: 32 },
            { header: 'D.O.B.', key: 'DOB', width: 10 }
        ];

        worksheet.addRow({id: 1, name: 'John Doe', dob: new Date(1970,1,1)});
        worksheet.addRow({id: 2, name: 'Jane Doe', dob: new Date(1965,1,7)});
        await workbook.xlsx.writeFile('public/streamed-workbook.xlsx');
        event.path = "streamed-workbook.xlsx" 
        return fileHandler.get(event, context)
      }
       module.exports.server = sls(app)

#Serverless.yml:#

provider:
  name: aws
  runtime: nodejs12.x
plugins:
  - serverless-offline
  - serverless-aws-static-file-handler/plugins/BinaryMediaTypes
custom:
  apiGateway:
    binaryMediaTypes:
      - "image/png"
      - "image/jpeg"
functions:
  app:
    handler: index.server
    events:
      - http: ANY /
      - http: 'ANY {proxy+}'  
  excel:
    handler: index.excel
    events:
      - http:
          path: /exportexcel
          method: get     

【讨论】:

    猜你喜欢
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    相关资源
    最近更新 更多