我正在创建一个REST API,当调用该API时,该API将允许用户下载文件,该文件将被下载,但另外,在文件成功下载后,我需要使用res.json({status : true})
发送回响应,并且从文件系统中删除。
我尝试了许多不同的方式,例如使用请求模块,创建自己的中间件,但没有任何效果。文件未下载且未发送响应,或者未发送响应但已下载文件。
请在下面找到API代码:
router.route('/generatePdf')
.get((req, res, next) => {
res.json({
status: false,
message: "Invalid Request made"
})
})
.post((req, res, next) => {
try{
let id = req.body.id;
console.log(id + " :this is id"); //I get the mongo ID here
if(id != null && id != ''){
if(validator.isMongoId(id)){
//fetch the data and generate the pdf
myFunctions.fetchInfoById(id, (err, user) => {
if (err) {
console.log('Err in fetchInfoById '+err);
res.json({
status: false
})
} else if (user!= null && user!= '') {
res.render('./referral/referralPdf/PdfTemplate.ejs', {
user: user
}, (err, html) => {
if (err) {
console.log('Err in rendering PDFTemplate ' + err);
res.json({
status: false
})
} else {
let options = {
format: 'A4', // allowed units: A3, A4, A5, Legal, Letter, Tabloid
orientation: 'portrait',
timeout: '100000',
zoomFactor: 0.7
}
pdf.create(html, options).toFile('./public/pdf/' + 'report.pdf', (err, response) => {
if (err) {
console.log('Error in generating pdf' + err);
res.json({
status: false
})
} else {
res.download(response.filename, 'fileContent.pdf', (err) => {
if (err) {
console.log(err);
} else {
fs.unlink(response.filename, (err) => {
if (err) {
console.log(err);
//send response as
res.json({
status : false
})
}else{
console.log('FILE REMOVED!');
res.json({
status : true
})
}
});
}
})
}
})
}
})
} else {
res.json({
status: false
})
}
})
} else {
res.json({
status: false
})
}
} else {
res.json({
status: false
})
}
} catch(e){
console.log("catch " + e);
res.json({
status: false
})
}
})
请帮助我实现这一目标,我已经花了几个小时了,但是无法提出更好的解决方案。
附注:使用上面的代码,我收到错误can't set headers after they are sent to the client
一旦下载成功并从文件系统中删除了文件,我面临的问题就是将响应发送回客户端。我可以使用res.render()
,然后再使用res.download()
。但是下载后我无法使用res.json({status : success})
。