在express.js中使用res对象下载文件,然后使用res.json将响应发送为true

时间:2019-04-02 04:53:26

标签: node.js rest api express download

我正在创建一个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})

0 个答案:

没有答案