我必须在猫鼬集合中存储大量数据,并且它变得越来越大且难以处理。我想将PDF文件保存在某个地方,然后将其链接到mongoose集合中,我不确定最好的解决方案。由于大多数链接都是关于直接文件上传的,因此我使用的是pdfmake库,然后将其存储到集合中。
这是我目前的模特
annual.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 collection
您可以看到内部我在路由内添加了GridF,但是它在哪里存储文件以及如何链接回DB?
答案 0 :(得分:2)
免责声明:这应该是评论,但对于评论来说太长了。
您的代码有一个非常严肃的标志,值得一提:
您应该under no circumstances在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
吗?
尚不清楚您的代码是否无法正常工作,或者您是否在询问解决方案是否足够好。