使用 Heroku 时如何保存 Excel 文件?
Posted
技术标签:
【中文标题】使用 Heroku 时如何保存 Excel 文件?【英文标题】:How to save Excel file when using Heroku? 【发布时间】:2019-11-30 18:16:17 【问题描述】:我正在开发 Node.js / Express 项目,其中包括获取 Excel 文件的路径。我一直在使用 excel4node xlsx 生成库,它在本地机器上运行应用程序时效果很好。
但是在 Heroku 上使用该应用程序时,我收到错误 400,但没有任何有用的信息。
之前我在上传图片时遇到过同样的问题,Amazon S3 解决了这些问题。我的结论是,这也与 Heroku 的“临时文件系统”有关,但作为初学者的 Web 开发人员,我很难掌握这一点。
路线代码如下。这仅适用于本地计算机:
router.get("/excel", authenticate, (req, res) =>
Product.find(quantity: $gt: 0 ).sort( code: 1 ).then((products, e) =>
const date = moment();
const time = date.format("DD.MM.YYYY");
const sheetName = `Stock $time`
const workbookName = `Company XYZ stock $time.xlsx`
const workbook = new excel.Workbook()
const worksheet = workbook.addWorksheet(sheetName);
const style = workbook.createStyle(
font:
bold: true,
size: 12
);
worksheet.cell(1, 1).string("Code").style(style);
worksheet.cell(1, 2).string("Description").style(style);
worksheet.cell(1, 3).string("Quantity").style(style);
worksheet.cell(1, 4).string("Class").style(style);
worksheet.cell(1, 5).string("Retail price").style(style);
worksheet.cell(1, 6).string("Net price").style(style);
products.forEach((product) =>
const cell = products.indexOf(product) + 2
worksheet.cell(cell, 1).string(product.code)
worksheet.cell(cell, 2).string(product.description)
worksheet.cell(cell, 3).number(product.quantity)
worksheet.cell(cell, 4).string(product.class)
worksheet.cell(cell, 5).number(product.price)
worksheet.cell(cell, 6).number(product.netprice)
)
workbook.write(workbookName, res);
).catch((e) =>
res.status(400).send();
);
);
我应该如何操作代码,以便将生成的 excel 文件下载到用户的默认下载文件夹?我不想将文件保存在云存储中的任何位置。
谢谢!
更新:错误代码
2019-07-23T04:36:24.256616+00:00 app[web.1]: TypeError: Value sent to Number function of cells ["E181"] was not a number, it has type of object and value of null
2019-07-23T04:36:24.256629+00:00 app[web.1]: at cellBlock.numberSetter [as number] (/app/node_modules/excel4node/distribution/lib/cell/index.js:77:15)
2019-07-23T04:36:24.256632+00:00 app[web.1]: at products.forEach (/app/routes/products.js:117:37)
2019-07-23T04:36:24.256634+00:00 app[web.1]: at Array.forEach (<anonymous>)
2019-07-23T04:36:24.256636+00:00 app[web.1]: at Product.find.sort.then (/app/routes/products.js:109:18)
2019-07-23T04:36:24.256638+00:00 app[web.1]: at process._tickCallback (internal/process/next_tick.js:68:7)
【问题讨论】:
在catch
部分添加控制台日志。.catch((e) => console.log(e);...
并在问题中发布错误。
嘿 Aritra,从 Heroku 应用程序日志中添加了错误代码,请参阅上面的编辑消息。第一行表示数据有问题,因为它与本地数据库不同。
【参考方案1】:
已经解决了这个问题。它与 Heroku 的临时文件系统无关,这是我的第一个结论:
在我的数据库中有 1 个文档在预期 Number 的字段中有空值并导致此错误:TypeError: Value sent to Number function of cells ["E181"] is not a number, it has type对象和 null 值
我不必更改任何代码,只需为该字段赋值。就这么简单:)
【讨论】:
以上是关于使用 Heroku 时如何保存 Excel 文件?的主要内容,如果未能解决你的问题,请参考以下文章