从手机下载时,快递发送后无法设置headers

Express can't set headers after they're sent while downloading from mobile

我定义了相当简单的路线:

router.get('/download', function(req, res){
  var file = __dirname + 'file.ext';
  res.download(file); 
});

当我从我的 comp 发出请求时它工作正常,但是一旦我从智能手机发出请求,服务器崩溃并且我得到以下错误:

throw new Error('Can\'t set headers after they are sent.');
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
...
at FSReqWrap.oncomplete (fs.js:95:15)

但是,如果我在快速打开服务器后,智能手机将毫无问题地下载它(从之前的session)。

我哪里做错了?

当浏览器向服务器请求一个 GET 请求时,它会在 header 信息中发送一个 ACCEPT 语句。参见 https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation#The_Accept.3A_header

因此,我猜您的浏览器会发出请求并向服务器发送请求(在其 header 中)"I can accept graphics files, video files, HTML files, text files, shrimp files*... all kinds of files"。您的手机发出相同的请求,但发送的是它可以接受的较短的 MIME 类型列表。也许您正在尝试 return 一个 PDF 文件到您的手机,但它并没有说它可以接受该类型,因为它没有 Adob​​e Reader 应用程序,例如。

因此,如果 Express 检测到客户端无法接受 PDF 文件,并且正在尝试下载 PDF 文件,它将设置 header return 代码。然后 Express 的另一部分尝试再次设置它。如果是我,我想我会升级我的 Express 版本,看看它是否不再有这个错误。

* 布巴甘幽默