Javascript 在NodeJS中下载文件
我正在尝试为nodejs应用程序实现一个下载路由器。几次下载后,我的应用程序崩溃了。有什么建议吗Javascript 在NodeJS中下载文件,javascript,node.js,download,Javascript,Node.js,Download,我正在尝试为nodejs应用程序实现一个下载路由器。几次下载后,我的应用程序崩溃了。有什么建议吗 app.route( "/download" ) .get( (req, res) => { var filename = req.query.filename; var file = __dirname + '/upload/' + filename; var mimetype = mime.lookup(file); res.setHeader('Cont
app.route( "/download" )
.get( (req, res) => {
var filename = req.query.filename;
var file = __dirname + '/upload/' + filename;
var mimetype = mime.lookup(file);
res.setHeader('Content-disposition', 'attachment; filename=' + req.query.filename);
res.setHeader('Content-type', mimetype);
var filestream = fs.createReadStream(file);
filestream.pipe(decrypt).pipe(res);
})
我得到这个错误:
Error [ERR_STREAM_WRITE_AFTER_END]: write after end
at writeAfterEnd (_stream_writable.js:243:12)
at Decipher.Writable.write (_stream_writable.js:291:5)
at ReadStream.ondata (_stream_readable.js:666:20)
at ReadStream.emit (events.js:182:13)
at addChunk (_stream_readable.js:283:12)
at readableAddChunk (_stream_readable.js:264:11)
at ReadStream.Readable.push (_stream_readable.js:219:10)
at fs.read (internal/fs/streams.js:196:12)
at FSReqCallback.wrapper [as oncomplete] (fs.js:473:5)
Emitted 'error' event at:
at Decipher.onerror (_stream_readable.js:690:12)
at Decipher.emit (events.js:182:13)
at writeAfterEnd (_stream_writable.js:245:10)
at Decipher.Writable.write (_stream_writable.js:291:5)
[... lines matching original stack trace ...]
at FSReqCallback.wrapper [as oncomplete] (fs.js:473:5)
更新
有人询问解密,文件使用加密模块加密:
var decrypt = crypto.createDecipher(algorithm, password);
此外,在阅读之后,我尝试了以下方法:
var filestream = fs.createReadStream(file);
filestream.pipe(decrypt).pipe(res, {end: false});
filestream.on("close", function() {
res.status(200);
res.end();
});
filestream.on("error", function() {
res.status(400);
res.end();
});
它不工作:(,我得到相同的错误只需使用
res.download()
此错误通常在内存不足时发生。 因此,我们必须在使用后关闭每一条流 流是事件发射器,因此您可以侦听某些事件
app.route( "/download" ).get( (req, res) => {
var filename = req.query.filename;
var file = __dirname + '/upload/' + filename;
var mimetype = mime.lookup(file);
res.setHeader('Content-disposition', 'attachment; filename=' + req.query.filename);
res.setHeader('Content-type', mimetype);
var filestream = fs.createReadStream(file);
filestream.pipe(decrypt).pipe(res);
filestream.on("finish", function(){
res.send();
})
})
什么是
decrypt
?我的猜测是,由于您从未使用res
关闭请求,因此您的请求在系统内存中挂起。@omerowitz我更新了我的问题。@DLowther是的,我尝试了几种方法正确结束请求,但没有任何效果。但是我的文件已加密,我必须解密首先,我怎么才能在下载之前解密呢?但如果我这么做,据我所知,我可能会过早关闭它。对吗?@Alexturean不确定你说的“太早”是什么意思?你可以通过在你的code@Bhuvi不管怎样,我为您尝试过,但发现内存泄漏时出错。