node.js - 删除node.js中的文件不起作用

标签 node.js express

我正在将 Node.js 与 Express 结合使用。 我正在尝试使用 Express js 将文件发送到客户端后删除该文件。

function deleteFile (file) { 
    fs.unlink(file, function (err) {
        if (err) {
            logger.error(err);
        }
    });
}

app.get("/deleteFileAfterDownload", function (req, res){
    var fileName = "a.pdf"
    var stream = fs.createReadStream(fileName);
    var streamClosed = false;
    req.on('end',function(){ 
        if (!streamClosed){  
            stream.emit('close');
            // I tried stream.destroy() but that is also not working
        }
    });
    stream.on('close', function () {
        streamClosed = true; 
        deleteFile(fileName);
    });
    req.on('data', function(){});  
    stream.pipe(res);
});

但是文件没有被删除。看来该进程仍在使用文件,因为在我结束该进程后,该文件就被删除了。

谁能告诉我为什么? 如果我做错了,请告诉我一个好的方法。

最佳答案

请在deleteFile中添加一个日志,并确保它被调用。

尝试简化它:

var fileName = "a.pdf"
var stream = fs.createReadStream(fileName);
stream.pipe(res);
res.once("finish", function () {
    deleteFile(fileName);
});

前面的示例仅在下载完成后删除文件, 如果您想无条件删除文件,请尝试以下操作:

var fileName = "a.pdf";
var stream = fs.createReadStream(fileName);
stream.pipe(res).once("close", function () {
    stream.close();
    deleteFile(fileName);
});

stream.close() 在这里很重要,因为如果管道中止,流不会关闭。

关于node.js - 删除node.js中的文件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37317676/

相关文章:

javascript - Pg-promise:链接条件查询

javascript - 使用 Sequelize.js 创建简单的 PUT 请求时出错

javascript - 无法在 forEach 循环 JavaScript 之外访问变量

node.js - Shopify App HMAC Validation Failed 如何解决?

javascript - passport.js 做什么以及我们为什么需要它?

node.js - MongoDB 如何捕获deleteMany中的错误

javascript - 使用 EJS 或 jQuery 设置 HTML 标签的属性

javascript - 如何在Javascript中从Azure Blob存储下载数据后将base64编码的数据嵌入图像中?

node.js - 在 Nginx 后面运行 Express 应用程序时出现间歇性 502 Bad Gateway 错误

javascript - 从 Node 中的json文件中删除