来自百度?

想必你搜索看到此文章,一定是遇到了和我一样的问题。

express 中如果我们使用res.download处理文件下载,中途被取消下载,就会出现以下异常

node.js:116
    throw e; // process.nextTick error, or 'error' event on first tick
        ^
        Error: Can't remove headers after they are sent.
        at ServerResponse.removeHeader (http.js:537:11)
        at Socket. (/usr/local/lib/node/.npm/express/2.0.0rc/package/lib/response.js:205:19)
        at Socket.emit (events.js:59:20)
        at Array. (net.js:799:27)
        at EventEmitter._tickCallback (node.js:108:2

查看了一下express的源代码,发现出现err的时候,会移除“Content-Disposition“ http header,这样必要会异常,因为响应已经发给客户端了,我们只需要将”if (err) self.removeHeader('Content-Disposition');“ 这段源代码注释掉就可以了。 如果不想修改express的源代码,我们可以在require('express')后,对express 进行一个简单修复:

var express = require('express');
//fixed express download cancel bug:
require('http').ServerResponse.prototype.download = function(path, filename, fn){
    var self = this;
    // support callback as second arg
     if ('function' == typeof filename) {
        fn = filename;
        filename = null;
    }
    // transfer the file
     this.attachment(filename || path).sendfile(path, function(err){
        // if (err) self.removeHeader('Content-Disposition');
         if (fn) return fn(err);
        if (err) {
            self.req.next('ENOENT' == err.code
                ? null
                : err);
        }
    });
};

有爱

^_^ ,希望本文对你有用。

相关文章:

  • 2021-10-13
  • 2021-06-23
  • 2021-04-24
  • 2022-12-23
  • 2021-05-23
  • 2022-12-23
  • 2021-11-11
  • 2021-07-07
猜你喜欢
  • 2021-09-03
  • 2021-12-09
  • 2021-04-07
  • 2021-12-01
  • 2022-12-23
  • 2021-06-26
相关资源
相似解决方案