我是nodejs的新手。我使用graphicsmagick调整图像大小,然后再将其发送到浏览器。 我的代码看起来像这样(res是从函数发送的响应(req,res){...}) -
imageURLPromise
.then(function(response) {
var body = response.body;
if (body) {
console.log("Found From: " + response.request.uri.href);
//set response headers here
setResponseData(res, response);
var buf = new Buffer(body, "binary");
console.log(buf);
//gm module
gm(buf).resize(400,300).toBuffer(function(err,buffer) {
console.log("buffer here");
res.end(buffer, "binary");
});
}
}, function(error) {
console.log(error);
});
我在浏览器中获取图像,我在这里得到日志“缓冲区”,但浏览器仍处于“加载”状态。
我尝试将.stream()与gm一起使用并将stdout传递给响应,但它有同样的问题。
如果我取消gm并直接将主体写入响应,就像这样
res.end(body, 'binary');
然后它正常工作。
有人可以告诉我这里做错了吗?
答案 0 :(得分:2)
我弄明白了这个问题。 问题不在于node或gm,而在于HTTP响应头。
当GM返回缓冲区并将其写入HTTP响应时,它会将Transfer-Encoding标头设置为“chunked”。在这种情况下,永远不应该设置Content-Length标头。 你可以在这里读更多关于它的内容 http://en.wikipedia.org/wiki/Chunked_transfer_encoding
因为我设置了浏览器,即使在发送图像后,浏览器仍在等待内容。
代码与我发布的完全相同,除了在setResponseData()函数(基本上用于设置标题)中我没有设置内容长度标题。