node.js - 使用 Node.js 和 Angular 6 在 mongoose 中存储 PDF 文件
问题描述
我必须在猫鼬集合中存储大量数据,而且它变得非常大而且难以处理。我想将 PDF 文件保存在某个地方并将其链接到 mongoose 集合中,我不确定是否有最佳解决方案。由于大多数链接都是关于直接文件上传的,因为我使用的是 pdfmake 库,然后存储到集合中。
这是我目前的模型
年度.js
customerReport: {
createdBy: String,
creationDate: String,
hour: Number,
waitingHour: Number,
ccEmails: Array,
sendToEmail: String,
pdf: Schema.Types.Mixed,
customerNotes: String
},
这个pdf里面有整个pdf内容。
当我最终保存和存储数据时,在我的路线中
router.post('/stage/complete', (req, res, next) => {
var completed = new AnnualStage({
specs: req.body.specs,
contactDetails: req.body.contactDetails,
CalculationData: req.body.calculationData,
customersData req.body.customersData
customerReport: req.body.customerReport,
});
completed
.save()
.then(result => {
res.status(200).json({
result: result
});
})
.catch(err => {
res.status(500).json({
message: err.message
});
});
});
所有前端均由 Angular 6 完成并生成所有数据和 pdf 并将其保存到 mongo 集合
你可以在里面看到我已经在路由中添加了 GridF,但是它将在哪里存储文件以及它将如何链接回 DB?
解决方案
免责声明:这应该是评论,但评论太长了。
您的代码有一个非常严重的标志,值得一提:
在任何情况下都不应在 http 控制器中调用fs.readFileSync
(或任何涉及 I/O 操作的同步方法)。
这将阻止您的所有用户请求,直到文件被读取。如果多个用户同时调用此端点,他们中的大多数人的请求将被延迟很长时间。
相反,您应该调用fs.readFile
. 和代码看起来几乎一样async/await
,util.promisify
不会阻塞主线程:
const util = require('util');
const readFile = util.promisify(fs.readFile.bind.fs); // not really sure the bind is really needed tbh, maybe util.promisify(fs.readFile) works too
router.post('/stage/complete', async (req, res, next) => {
var completed = new AnnualStage({
specialRequest: req.body.specialRequest,
contactDetails: req.body.contactDetails,
requestData: req.body.requestData,
customerRequests: req.body.customers,
customerReport: req.body.customerReport,
});
completed.customerReport.pdf.data = await readFile(req.body.customerReport);
completed.customerReport.pdf.contentType = 'application/pdf';
completed
.save()
.then(result => {
res.status(200).json({
message: 'Handling POST request to /completed',
result: result
});
})
.catch(err => {
res.status(500).json({
message: err.message
});
});
});
此更改将严重改善您的帖子处理程序。
现在,你的问题。我真的不确定你在问什么。你说:
你可以在里面看到我已经在路由中添加了 GridF,但是它将在哪里存储文件以及它将如何链接回 DB?
您的代码片段中没有对gridFs的引用。也许你忘了粘贴一些代码?目前尚不清楚是否AnnualStage.save()
实际保存在 mongo 中。它使用gridfs
吗?
目前尚不清楚您的代码是否无法正常工作,或者您是否在询问您的解决方案是否足够好。
推荐阅读
- java - 如何在日期/时间范围内显示进度/搜索栏android
- excel - VBA 宏根据相邻值删除重复项及其相邻单元格
- stm32 - STM32L433RCTx USB MSC 读/写失败,GetCapacityFS 工作
- ag-grid - 获取添加的数据/行的节点ID
- excel - 在 CUBEVALUE() 中使用 OR()
- android - android 崩溃中的 Agroa 屏幕共享
- javascript - 防止在传递参数时立即调用函数
- php - 用于检查 Zip 文件有效性的 API 方法 - 之后 zip 没有关闭?
- reactjs - 警告:无法对未安装的组件执行 React 状态更新。反应
- sql-server - 使用 Microsoft Excel 连接到 Microsoft SQL 仅适用于受信任的连接