我定义了相当简单的路线:
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)
但是,如果我在快速启动服务器之后,智能手机会毫无问题地下载它(从之前的会话开始)。
我做错了什么?
答案 0 :(得分:1)
当浏览器向服务器请求带有GET的请求时,它会在标头信息中发送ACCEPT语句。见https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation#The_Accept.3A_header
所以,我猜你的浏览器发出请求并对服务器说(在其标题中)“我可以接受图形文件,视频文件,HTML文件,文本文件,虾文件* ...各种文件”。并且您的手机会发出相同的请求,但会发送一个可以接受的较短的MIME类型列表。也许您正在尝试将PDF文件返回到您的手机,并且它没有说它可以接受该类型,因为它没有Adobe Reader应用程序,例如。
因此,如果Express检测到客户端无法接受PDF文件,并且它正在尝试下载PDF文件,则会设置标头返回码。然后Express的另一部分尝试再次设置它。如果是我,我想我会升级我的Express版本,看它是否不再有这个错误。
* Bubba Gump幽默