0

我需要一个关于如何生成 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  
4

1 回答 1

0

最后有一个解决方案,它可以是暂时的,但很容易解决问题。我能够在本地系统上下载文件。因此,在服务器端,您可以轻松使用静态文件方法,在点击链接时根据文件扩展名轻松下载或打开文件。在客户端,您可以轻松调用该方法。如果这些是应用程序/八位字节流文件而不是浏览器本身的文件下载,如果是图像/pdf文件,那么它将很容易在浏览器中打开。

当我在无服务器离线工作时,它提供了一个名为“serverless-aws-static-file-handler”的简单包。看看:https ://www.npmjs.com/package/serverless-aws-static-file-处理程序

此函数将从路径中获取文件并从处理程序上提供的路径返回文件,该处理程序适用于 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     
于 2019-12-29T06:57:01.723 回答