我正在尝试为nodejs应用程序实现下载路由器。几次下载后,我的应用程序崩溃了。有什么建议吗?

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);

另外,在阅读res.end() is never sent after streaming a file to client之后,我尝试了以下方法:
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(<filepath>)即可。

https://expressjs.com/en/api.html#res.download

关于javascript - 在Node JS中下载文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53280368/

10-10 00:09
查看更多